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


上午试题:

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


软件设计模式java课后习题 软件设计模式答案_java






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

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

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

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

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

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


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

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

下午试题:

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


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

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

软件设计模式java课后习题 软件设计模式答案_java_02

类图

【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关键字】
【可省略public关键字】
 (3) implements IDepartment
implements IDepartment
 (5) interface IFactory
【可省略public关键字】