2012年下半年软件设计师之设计模式相关试题及解答

194 篇文章 12 订阅
189 篇文章 406 订阅

       2012年下半年(11月份)软考软件设计师级别考试一共有三道与设计模式相关的试题(共19分),其中上午填空题两道(4分),下午试题一道(15分)。试题及分析如下:

 

     上午试题:

       ● 每种设计模式都有特定的意图,(44)模式使得一个对象在其内部状态改变时通过调用另一个类中的方法改变其行为,使这个对象看起来如同修改了它的类。下图是采用该模式的有关TCP连接的结构图实例。该模式的核心思想是引入抽象类(45)来表示TCP连接的状态,声明不同操作状态的公共接口,其子类实现与特定状态相关的行为。当一个(46)对象收到其它对象的请求时,它根据自身的当前状态做出不同的反应。

  

 

       (44) A. 适配器(Adapter)    B. 命令(Command)    C. 观察者(Observer)    D. 状态(State)

       (45) A. TCPConnection    B. state    C. TCPState    D. TCPEstablished

       (46) A. TCPConnection    B. state    C. TCPState    D. TCPEstablished

 

   ● 欲使类A的所有者都使用A的同一个实例,应(47)

       (47) A. 将A标识为final

              B. 将A标识为abstract

              C. 将单例(Singleton)模式应用于A

              D. 将备忘录(Memento)模式应用于A

 

试题分析与解答:

      (44)-(46)考查状态模式,本题是GoF经典著作《设计模式:可复用面向对象软件的基础》中的实例,Sunny认为原图中的具体状态类类名TCPListen应该改为TCPListening更为合适,该状态表示“监听中”;(47)考查单例模式

      答案如下:

      (44) D,考查“状态模式”的定义(意图)。状态模式:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。在状态模式中,将与特定状态有关的行为封装到一系列状态类中,拥有多个状态的类称为环境类,可以向环境类注入不同的状态类对象。状态模式有三个关注点:多个状态;不同状态下行为不同;状态之间可以相互转换

      (45) C,在类图中,TCPState是抽象状态类,抽象状态类用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现了这些方法,由于不同状态下对象的行为可能不同,因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象状态类中。

      (46) A,在状态模式中,真正拥有状态的角色称为环境类,如本题类图中的TCPConnection类,环境类又称为上下文类,它是拥有多种状态的对象。由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出去形成单独的状态类。在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。当客户端调用环境类的方法时,它将根据当前状态做出不同的反应,将有些方法的调用委派给状态类来完成。

      (47) C,在题干中提到要“使用类A的同一类实例”,言下之意是类A的实例具有唯一性,此时可以应用单例模式(Singleton Pattern),单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。

 

      更多关于状态模式的介绍,参见“处理对象的多种状态及其相互转换——状态模式”。

      更多关于单例模式的介绍,参见“确保对象的唯一性——单例模式”。

 

    下午试题:

      试题五为C++版,试题六为Java版,考查内容完全相同,下面以Java版为例:

 

       试题六(共15分) 
      阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。

      【说明】
      现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SQL Server和Access两种数据库以及系统中的数据库表Department为例,其类图如下图所示。

类图

【Java代码】

import java.util.*;

 

class Department {/*代码省略*/}

 

interface IDepartment {
       (1)   ;
       (2)   ;
}

 

class SqlserverDepartment      (3)      {
    public void Insert(Department department) {
        System.out.println("Insert a record into Department in SQL Server!");
        //其余代码省略
    }

    public Department GetDepartment(int id) {
        /*代码省略*/
     }
}

 

class AccessDepartment      (4)     {
    public void Insert(Department department) {
        System.out.println("Insert a record into Department in Access!");
        //其余代码省略
    }
    public Department GetDepartment(int id) {
        /*代码省略*/
    }
}

 

      (5)           {
           (6)          ;
}

 

class SqlserverFactory implements IFactory {
    public IDepartment CreateDepartment() {
        return new SqlserverDepartment();

    }
    //其余代码省略
}

 

class AccessFactory implements IFactory {
    public IDepartment CreateDepartment() {
        return new AccessDepartment();
    }

    //其余代码省略

}

       试题分析:这道题考查抽象工厂模式的实现,难度很小,根据类图和已有代码很容易就能写出空缺的代码,在抽象产品IDepartment中声明了具体产品类的业务方法,在抽象工厂类IFactory中声明了抽象工厂方法,具体工厂类创建对应的具体产品对象。

 

       答案如下:

       (1) public void Insert(Department department)【可省略public关键字】

       (2) public Department GetDepartment(int id) 【可省略public关键字】

       (3) implements IDepartment

       (4) implements IDepartment

       (5) interface IFactory

       (6) public IDepartment CreateDepartment()【可省略public关键字】

 

本题在《设计模式实训教程》(刘伟,清华大学出版社,2012年1月)一书中有对应的原题(参见:P60,“第3章 创建型模式实训” 3.2 实训实例 之 3.2.3 抽象工厂模式实例之数据库操作工厂)。本考题与书中实例基本一致,微笑

 

【作者:刘伟  http://blog.csdn.net/lovelion

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35 2.6 支持多种窗口系统 35 2.6.1 我们是否可以使用Abstract Factory 模式 35 2.6.2 封装实现依赖关系 35 2.6.3 Window和WindowImp 37 2.6.4 Bridge 模式 40 2.7 用户操作 40 2.7.1 封装一个请求 41 2.7.2 Command 类及其子类 41 2.7.3 撤消和重做 42 2.7.4 命令历史记录 42 2.7.5 Command 模式 44 2.8 拼写检查和断字处理 44 2.8.1 访问分散的信息 44 2.8.2 封装访问和遍历 45 2.8.3 Iterator类及其子类 46 2.8.4 Iterator模式 48 2.8.5 遍历和遍历过程中的动作 48 2.8.6 封装分析 48 2.8.7 Visitor 类及其子类 51 2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构型 模式 100 4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE(外观)—对象结构型 模式 121 4.6 Flyweight(享元)—对象结构型 模式 128 4.7 Proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter与Bridge 144 4.8.2 Composite、Decorator与Proxy 145 第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为型模式 147 5.2 COMMAND(命令)—对象行为型 模式 154 5.3 INTERPRETER(解释器)—类行为型 模式 162 5.4 ITERATOR(迭代器)—对象行为型 模式 171 5.5 MEDIATOR(中介者)—对象行为型 模式 181 5.6 MEMENTO(备忘录)—对象行为型 模式 188 5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 5.12.4 对发送者和接收者解耦 229 5.12.5 总结 231 第6章 结论 232 6.1 设计模式将带来什么 232 6.2 一套通用的设计词汇 232 6.3 书写文档和学习的辅助手段 232 6.4 现有方法的一种补充 233 6.5 重构的目标 233 6.6 本书简史 234 6.7 模式界 235 6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值