2010年11月份软件设计师:设计模式(观察者模式,组合模式)
来源:互联网 发布:php 图片水印 编辑:程序博客网 时间:2024/06/07 19:48
2010年11月份全国计算机技术软件专业技术(水平)考试软件设计师,其中,设计模式,上午题主要考察观察者模式和下午题考察了组合模式。
上午题
- 下面的UML类图描绘的是 (46) 设计模式。关于该设计模式的叙述中,错误的是 (47) 。
(46)A. 桥接 B. 策略 C. 抽象工厂 D. 观察者
(47)
A. 该设计模式中的 Observer 需要维护至少一个 Subject 对象
B. 该设计模式中的 ConcreteObserver 可以绕过 Subject 及其子类的封装
C. 该设计模式中一个 Subject 对象需要维护多个 Observer 对象
D. 该设计模式中 Subject 需要通知 Observer 对象其自身的状态变 化
- 解析:
题中的类图是观察者设计模式,在该设计模式中的Subject和Observer分别表示抽象的被观察者(即主题)和观察者。通常,一个观察者(Observer)观察一个被观察者(Subject),而一个被观察者可以被多个观察者关注,是一对多的关系。当Subject的状态发生变化时,Subject将通知所有的Observer,告知状态已经发生了变化,而Observer收到通知后,将查询Subject的状态。 注意,观察者必须注册,也就是图中的attach(),才能被Notify()。
下午题
- 试题六(共 15 分)
- 阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
图6-1组织结构图
图6-2组合(Composition)设计模式
某公司的组织结构图如图6-1 所示,现采用组合(Composition)设计模式来构造该公司的组织结构,得到如图6-2 所示的类图。
其中Company 为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分司/办事处或者部门的方法接口。类 ConcreteCompany 表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类 HRDepartment 和 FinanceDepartment分别表示人力资源部和财务部。
【Java 代码】
import java.util.*; (1) Company { Protected String name; Public Company(String name) { (2) = name; } Public abstract void Add(Company c); // 增加子公司、办事处或部门 Public abstract void Delete(Company c); // 删除子公司、办事处或部门 } class ConcreteCompany extends Company { private List< (3) > children = new ArrayList< (4) >(); // 存储子公司、办事处或部门 public ConcreteCompany(String name) { super(name); } public void Add(Company c) { (5) .add(c); } public void Delete(Company c) { (6) .remove(c); } } class HRDepartment extends Company { public HRDepartment(String name) { super(name); } // 其它代码省略 } class FinanceDepartment extends Company { public FinanceDepartment(String name) { super(name); } // 其它代码省略 } public class Test { public static void main(String[] args) { ConcreteCompany root = new ConcreteCompany("北京总公司"); root.Add(new HRDepartment("总公司人力资源部")); root.Add(new FinanceDepartment("总公司财务部")); ConcreteCompany comp = new ConcreteCompany("上海分公司"); comp.Add(new HRDepartment("上海分公司人力资源部")); comp.Add(new FinanceDepartment("上海分公司财务部")); (7) ConcreteCompany comp1 = new ConcreteCompany("南京办事处"); comp1.Add(new HRDepartment("南京办事处人力资源部")); comp1.Add(new FinanceDepartment("南京办事处财务部")); (8) // 其它代码省略 } }
解析:
1、abstract class 2、this.name 3、Company 4、Company 5、children 6、children 7、root.Add(comp) 8、comp.Add(comp1)
Composite模式将对象组合成树形结构以表示“整体-部分”的层次结构,其中的组合对象使得你可以组合基元对象以及其他的组合对象,从而形成任意复杂的结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。 Composite模式的结构如下图所示:其中:
- 类Component为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的缺省行为,声明一个接口用于访问和管理Component的子部件;
- 类Leaf在组合中表示叶节点对象,叶节点没有子节点;并在组合中定义图元对象的行为;
- 类Composite定义有子部件的那些部件的行为,存储子部件,并在Component接口中实现与子部件有关的操作;
- 类Client通过Component接口操纵组合部件的对象。
- 下列情况可以使用Composite模式:
(1)表示对象的整体-部分层次结构;
(2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
图6-2中的Company对应的就是上图中的类Component, ConcreteCompany对应的是类Composite;而上图中的FinanceDepartment和HRDepartment扮演的就是类Leaf的角色。
由于类Company的作用是为其子类提供统一的操作接口,所以将其定义为抽象类。 - 空(1)~(2)考查的是如何定义抽象类Company。在Java中,可以通过在类名之前加abstract关键字来定义抽象类,因此空(1)处应填入abstract class。空(2)考查的是在构造函数中如何给数据成员赋初值。当构造函数的参数与类的数据成员同名时,可以借助this指针来进行区别,因此空(2)处应填入this.name。
- 空(3)~(6)考查对模式中Composite节点的定义。由图6-2可知,ConcreteCompany与Company之间是聚集关系,即ConcreteCompany的实例中包含多个Company的子类的实例。为了表示这种聚集关系,使用了Java包中的类模板List。类模板必须在实例化之后才能使用。实例化类模板时,要给出类型实参。由于children表示的是类Company的子类的实例集合,所以空(3)和(4)处都应填入Company。- - 空(5)和(6)处分别使用了List中提供的方法来实现添加和删除子公司、办事处或部门。children是list的实例,所以空(5)和(6)处都应填入children。
- 空(7)和(8)考查的是组合模式的实用。由图6-1可知,组织结构图的根目录是“北京总公司”,“上海分公司”应该插入在根目录之下。所以空(7)处应填入root.Add(comp)。而“南京办事处”是以“上海分公司”为根的子树中的节点,应插入在“上海分公司”这个节点的下面。对象comp表示的是以“上海分公司”为根的子树的根节点,所以空(8)处应该填入comp.Add(comp1).
此文章主要查考了:
(1) http://wenku.baidu.com/view/30fcdd43336c1eb91a375d95.html?from=search
(2)http://wenku.baidu.com/view/86fefd4569eae009581becf0.html?from=search
- 2010年11月份软件设计师:设计模式(观察者模式,组合模式)
- 软件设计师考试:设计模式
- 设计模式(观察者模式)
- 设计模式,行为模式(观察者模式)
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- iOS编程------- Block高级------>Block传值
- iOS中nil NULL Nil 和NSNull区别
- CATIA入门第一天
- 在windows上部署redis服务,以及使用jedis客户端。
- C++中的虚函数(类的向上转换,和向下转换)
- 2010年11月份软件设计师:设计模式(观察者模式,组合模式)
- 调试的错误就是编程给你最好的东西,因为在每个错误上面都标志着前进的一步。
- poj 3237 树链剖分
- 文本分类入门(三)统计学习方法
- iOS开发之理解iOS中的MVC设计模式
- MySQL事务处理
- 统计文件的代码
- 【项目管理】Sonatype Nexus,Maven私服
- Linq To Entity 的增删改查(转)