2011年系统架构设计师考试设计模式试题题量与2010年保持一致, Sunny友情建议:建议大家先做做这些试题,看是否能够正确解答,如果在解答的同时能够拿出具体的设计和实现方案,我相信一定会受益匪浅!,试题分析和参考答案为Sunny个人所作,可能与某些已发布的“标准答案”会有所不同,如有不同意见,欢迎交流!【说明:为了体现试题的真实性,每一道试题的题号均保留原始真题题号】
2011年系统架构设计师考试设计模式考题如下:
【全国计算机技术与软件专业技术资格(水平)考试 2011年下半年 系统架构设计师 上午试卷】
某公司欲开发一门户网站,将公司的各个分公司及办事处信息进行整合。现决定采用Composite设计模式来实现公司的组织结构关系,并设计了如下图所示的UML类图。图中与Composite模式中的“Component”角色相对应的类是(33) ,与“Composite”角色相对应的类是 (34) 。
(33) A. Company B. FinanceDepartment C. HRDepartment D. ConcreteCompany
(34) A. Company B. FinanceDepartmentC. HRDepartment D. ConcreteCompany
某软件公司正在设计一个通用的嵌入式数据处理平台,需要支持多种数据处理芯片之间的数据传递与交换。该平台的核心功能之一要求能够屏蔽芯片之间的数据交互,使其耦合松散,并且可以独立改变芯片之间的交互过程。针对上述需求,采用 (53) 最为合适。
(53) A. 抽象工厂模式 B. 策略模式 C. 中介者模式 D. 状态模式
某软件公司正在设计一个图像处理软件,该软件需要支持用户在图像处理中的撤销和重做等动作,为了实现该功能,采用 (54) 最为合适。
(54) A. 单例模式 B. 命令模式 C. 访问者模式 D. 适配器模式
某互联网公司正在设计一套网络聊天系统,为了限制用户在使用该系统时发表不恰当言论,需要对聊天内容进行特定敏感词的过滤。针对上述功能需求,采用 (55) 能够灵活配置敏感词的过滤过程。
(55) A. 责任链模式 B. 工厂模式 C. 组合模式 D. 装饰模式
------------------------------------------------------------------------------------------------------------------------------------------------------
试题分析与解答:
(33) - (34) 本题是组合模式(Composite Pattern)的一个应用实例,组合模式用于组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体-部分”模式。在组合模式结构中,包含3个角色,分别是Component(抽象构件)、Leaf(叶子构件)和Composite(容器构件)。其中,抽象构件类Component既可以表示叶子构件Leaf,又可以表示容器构件Composite,客户端针对抽象构件进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理;同时容器构件与抽象构件之间还建立一个聚合关联关系,在容器构件中既可以包含叶子,也可以继续包含容器,以此实现递归组合,形成一个树形结构。
在图中,我们不难分析出:
- Company类充当抽象构件角色(Component);
- ConcreteCompany充当容器构件或组合构件角色(Composite);
- FinanceDepartment和HRDepartment充当叶子构件角色(Leaf)。
在《设计模式实训教程》一书中Sunny给出了此题完整的代码模拟实现,关于组合模式的详细讲解,大家可以参考:树形结构的处理——组合模式。
参考答案:A, D
(53) 根据题干,该软件公司的通用嵌入式数据处理平台需要支持多种数据处理芯片之间的数据传递和交换,而且要能够屏蔽芯片之间的数据交互,降低芯片之间的耦合度,可以独立改变芯片之间的交互过程。为了达到这个目标,我们可以引入一个“第三者”来专门负责芯片之间的交互,而芯片之间无须产生直接引用,它们通过这个“第三者”来间接交互。此时,我们可以选择中介者模式(Mediator Pattern)进行设计。中介者模式通过引入一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
建议大家使用中介者模式来为本题提供一套设计方案。
关于中介者模式的更多介绍,大家可以参考:协调多个对象之间的交互——中介者模式。
参考答案:C
(54) 根据题干,该软件公司设计的图像处理软件在图像处理过程中要能够实现撤销和重做等操作,在GoF设计模式,我们可以使用命令模式(Command Pattern)或备忘录模式(Memento Pattern)来实现撤销和重做。
在命令模式中,将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。在具体实现撤销操作时,我们可以提供与execute()方法相对应的逆向方法undo(),用于撤销之前的execute()方法所执行的操作,当然也可以提供一个redo()方法,用于恢复撤销,即实现二次撤销。总之,命令模式通过提供反向操作来实现撤销。
备忘录模式是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。在实际使用时,撤销操作在更多情况下是使用备忘录模式来实现的。总之,备忘录模式通过保存和获取历史状态来实现撤销。关于备忘录模式的更多介绍,大家可以参考:撤销功能的实现——备忘录模式。
在本题的备选答案中,单例模式、访问者模式和适配器模式显然与撤销操作没有任何直接关系,因此正确的选项是“命令模式”。
参考答案:B
(55) 根据题干,该网络聊天系统可以对特定敏感词进行过滤,而且要求灵活配置敏感词过滤过程。深入理解题干,不难发现该系统需要提供多个敏感词的过滤器,每个过滤器可过滤一个敏感词,这些过滤器可以很灵活地形成一个过滤链。所有涉及到链式过滤的场景,我们都可以考虑使用职责链模式(Chain of Responsibility Pattern)来进行设计。通过职责链模式,可避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。
建议大家使用职责链模式来为本题提供一套设计方案。
关于职责链模式的详细讲解,大家可以参考:请求的链式处理——职责链模式。
参考答案:A
【作者:刘伟 http://blog.csdn.net/lovelion】