免费智能真题库 > 历年试卷 > 软件设计师 > 2022年下半年 软件设计师 上午试卷 综合知识
  第44题      
  知识点:   类图   设计模式   消息   耦合   消息传递
  章/节:   面向对象基础知识       

 
在某系统中,不同级别的日志信息记录方式不同,每个级别的日志处理对象根据信息级别高低,采用不同方式进行记录。每个日志处理对象检查消息的级别,如果达到它的级别则进行记录,否则不记录然后将消息传递给它的下一个日志处理对象。针对此需求,设计如下所示类图。该设计采用(44)模式使多个前后连接的对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。该模式属于(45)模式,该模式适用于(46)模式。
 
 
  A.  责任链(Chain of Responsibility)
 
  B.  策略(Strategy)
 
  C.  过滤器(Filter)
 
  D.  备忘录 (Memento)
 
 
 

 
  第32题    2019年下半年  
   62%
(32)不是采用MVC(模型-视图-控制器)体系结构进行软件系统开发的优点。
  第47题    2014年上半年  
   45%
下列设计模式中,(46)模式既是类结构型模式,又是对象结构型模式。此模式与(47)模式类似的特征是,都给另一个对象提供了一定程度..
  第43题    2009年上半年  
   32%
当不适合采用生成子类的方法对己有的类进行扩充时,可以采用(43)设计模式动态地给一个对象添加一些额外的职责;当应用程序由于使..
   知识点讲解    
   · 类图    · 设计模式    · 消息    · 耦合    · 消息传递
 
       类图
        类图(Class Diagram)展现了一组对象、接口、协作及其之间的关系。在面向对象系统的建模中所建立的最常见的图就是类图。
        类图给出了系统的静态设计视图,包含主动类的类图给出了系统的静态进程视图。作为模型管理视图还可以含有包或子系统,二者都用于把模型元素聚集成更大的组块。类图用于对系统的静态视图建模。这种视图主要支持系统的功能需求,即系统要提供给最终用户的服务。当对系统的静态设计建模时,通常以下述3种方式之一使用类图:对系统的词汇建模;对简单的协作建模;对逻辑数据库模式建模。
        作为静态视图的类图可以包含依赖、关联、泛化、组合、实现关系以及注解和约束等。
        (1)依赖关系是两个事物之间的语义关系,其中一个事物发生变化会影响另一个事物的语义。
        (2)关联关系是一种结构关系,它描述了一组对象之间的链接关系。其中有一种特殊类型的关联关系,即聚集关系,它描述了整体与部分的结构关系。
        (3)泛化关系是一种一般—特殊关系,利用这种关系,子类可以共享父类的结构和行为。
        (4)实现关系是类之间的语义关系,其中的一个类制订了另一个类保证执行的契约。实现关系用于两种情况:在接口和实现它们的类或构件之间;在用例和它们的协作之间。
        (5)组合是聚集关系的变种,表示元素间更强的组合关系。各种关系图例如下图所示。
        
        各种关系图例
 
       设计模式
               设计模式的要素
               设计模式一般有以下4个要素。
               (1)模式名称(Pattern Name)。一个助记名,它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了设计词汇。设计模式允许在较高的抽象层次上进行设计。基于一个模式词汇表,就可以讨论模式并在编写文档时使用它们。模式名可以帮助人们思考,便于人们与其他人交流设计思想及设计结果。
               (2)问题(Problem)。描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,可能描述了特定的设计问题,如怎样用对象表示算法等;也可能描述了导致不灵活设计的类或对象结构。
               (3)解决方案(Solution)。描述了设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
               (4)效果(Consequences)。描述了模式应用的效果及使用模式应权衡的问题。尽管描述设计决策时并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。
               创建型设计模式
               创建型模式抽象了实例化过程。它们可以帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
               创建型模式中有两个不断出现的主旋律:第一,它们都将关于该系统使用哪些具体的类的信息封装起来;第二,它们隐藏了这些类的实例是如何被创建和放在一起的。整个系统关于这些对象所知道的是由抽象类所定义的接口。因此,创建型模式在什么地方被创建、谁创建它、它是怎样被创建的以及何时创建这些方面给予了很大的灵活性。它们允许用结构和功能差别很大的"产品"对象配置一个系统。配置可以是静态的(即在编译时指定),也可以是动态的(在运行时)。
               结构性设计模式
               结构性模式涉及如何组合类和对象以获得更大的结构。结构性模式采用继承机制来组合接口或实现。结构性对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。
               Composite模式是结构性对象模式的一个实例。它描述了如何构造一个类层次式结构,这一结构由两种类型的对象所对应的类构成。
               Flyweight模式为共享对象定义了一个结构。至少有两个原因要求对象共享,即效率和一致性。Flyweight模式的对象共享机制主要强调对象的空间效率。使用很多对象的应用必须考虑每一个对象的开销。
               Facade模式描述了如何用单个对象表示整个子系统。模式中的Facade用来表示一组对象,Facade的职责是将消息转发给它所表示的对象。
               Bridge模式将对象的抽象和其实现分离,从而可以独立地改变它们。
               Decorator模式描述了如何动态地为对象添加职责。这一模式采用递归方式组合对象,允许添加任意多的对象职责。
               行为设计模式
               行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂控制流。它们将你的注意力从控制流转移到对象间的联系方式上来。
               行为类模式使用继承机制在类间分派行为,主要有TemplateMethod和Interpreter两种模式。
               行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。
               Observer模式定义并保持对象间的依赖关系。典型的Observer的例子就是Smalltalk中的模型/视图/控制器,其中一旦模型的状态发生变化,模型的所有视图都会得到通知。
               其他的行为对象模式常将行为封装在一个对象中,并将请求指派给它。
 
       消息
        对象之间进行通信的一种构造叫做消息。但一个消息发送给某个对象时,包含要求接收对象去执行某些活动的信息,接收到消息的对象经过解释,然后予以响应,这种通信机制叫做消息传递。发送消息的对象不需要知道接收消息的对象如何对请求予以响应。
 
       耦合
        耦合性是指模块之间联系的紧密程度。耦合性越高,则模块的独立性越差。模块间耦合的高低取决于模块间接口的复杂性、调用的方式及传递的信息。模块的耦合有以下几种类型:
        (1)无直接耦合:指两个模块间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。因此,模块间耦合性最弱,模块独立性最高。
        (2)数据耦合:指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递。这种耦合程度较低,模块的独立性较高。
        (3)标记耦合:指两个模块之间传递的是数据结构,如高级语言中的数据组名、记录名、文件名等这些名字即为标记,其实传递的是这个数据结构的地址。
        (4)控制耦合:指一个模块调用另一个模块时,传递的是控制变量,被调模块通过该控制变量的值有选择地执行块内的某一功能。
        (5)公共耦合:指通过一个公共数据环境相互作用的那些模块之间的耦合。
        (6)内容耦合:这是程度最高的耦合。当一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部,这种模块之间的耦合为内容耦合,这种情况往往出现在汇编程序设计中。
 
       消息传递
        消息是内存空间中一段长度可变的缓冲区,其长度和内容均由用户定义。从操作系统的角度来看,所有的消息都是单纯的字节流,既没有确切的格式,也没有特定的含义。对消息内容的解释是由应用来完成的,应用根据自定义的消息格式,将消息解释成特定的含义,如某种类型的数据、数据块的指针或空。
        消息传递指的是任务与任务之间通过发送和接收消息来交换信息。
        消息机制由操作系统来维护,包括定义寻址方式、认证协议、消息的数量等。一般提供两个基本的操作:send操作,用来发送一条消息;receive操作,用来接收一条消息。如果两个任务想要利用消息机制来进行通信,它们首先要在两者之间建立一个通信链路,然后就可以使用send和receive操作来发送和接受消息。
        任务之间的通信方式可以分为直接通信和间接通信两种。
        (1)直接通信。在直接通信方式下,通信双方必须明确知道与之通信的对象。采用类似下面的通信原语:
        .send(P,message):发送一条消息给任务P;
        .receive(Q,message):从任务Q那里接收一条消息。如果没有收到消息,可以阻塞起来等待消息的到来,也可以立即返回。
        在通信双方之间存在一条通信链路,该链路具有如下特征:
        .通信链路是自动建立的,由操作系统来维护;
        .每条链路只涉及一对相互通信的任务,每对任务之间仅存在一条链路;
        .通信链路可以是单向或双向的。
        (2)间接通信。在间接通信方式下,通信双方不需要指出消息的来源或去向,而是通过共享的邮箱(mailbox)来发送和接收消息,每个邮箱都有一个唯一的标识。采用类似下面的通信原语:
        .send(A,message):发送一条消息给邮箱A;
        .receive(A,message):从邮箱A接收一条消息。
        间接通信的特点:
        .对于一对任务,只有当它们共享一个公共邮箱时才能进行通信;
        .一个邮箱可以被多个任务访问,每对任务也可以使用多个邮箱来通信;
        .通信可以是单向或双向的。
        邮箱只能存放单条消息,它提供了一种低开销的消息传递机制,其状态只有两种:空或满。另外一种间接通信机制是消息队列。它与邮箱是类似的,但可以同时存放若干条消息,提供了一种任务间缓冲通信的方法。如下图所示,发送消息的任务将消息放入队列,而接收消息的任务则将消息从队列中取出。
        
        消息队列示意图
   题号导航      2022年下半年 软件设计师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第44题    在手机中做本题