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组合模式
图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

0 0