设计模式已成为软件设计师考试试题的一个重要组成部分,每次考试中都会有将近20分左右的设计模式试题,下面我分析一下最近一次软考(2012年5月)的设计模式试题,希望能够给备考软件设计师的童鞋们提供一点帮助,。
以下试题都来源于2012年5月软件设计师考试真题。
上午试题:
● 面向对象分析与设计中的(37)是指一个模块在扩展性方面应该是开放的,而在更改性方面应该是封闭的;而(38)是指子类应当可以替换父类并出现在父类能够出现的任何地方。
(37) A.开闭原则 B.替换原则 C.依赖原则 D.单一职责原则
(38) A.开闭原则 B.替换原则 C.依赖原则 D.单一职责原则
● (40)限制了创建类的实例数量,而(41)将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
(40) A.命令模式(Command) B.适配器模式(Adapter) C.策略模式(Strategy) D.单例模式(Singleton)
(41) A.命令模式(Command) B.适配器模式(Adapter) C.策略模式(Strategy) D.单例模式(Singleton)
● (43)设计模式允许一个对象在其内部状态改变时改变它的行为。下图为这种设计模式的类图,已知类 State 为抽象类,则类(44)的实例代表了Context 对象的状态。
(43) A.单件(Singleton) B.桥接(Bridge) C.组合(Composite) D.状态(State)
(44) A. Context B. ConcreteStateA C. Handle D. State
试题分析与解答:
总的来说,这几道题都非常简单,(37)、(38)考查面向对象设计原则,(40)、(41)、(43)、(44)考查设计模式,答案如下:
(37) A,这是开闭原则的定义。
(38) B,这是里氏代换原则(替换原则)的定义。
(40) D,单例模式用于限制类的实例数量。
(41) B,适配器模式用于将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
(43) D,状态模式允许一个对象在其内部状态改变时改变它的行为。
(44) B,具体状态类(例如ConcreteStateA)的实例代表了环境类(Context )对象的状态。
以上几道题在《设计模式实训教程》(刘伟,清华大学出版社,2012年1月)一书中都有原题,第(37)和(38)题参见“第2章 面向对象设计原则实训”选择题第(6)题(第31页),第(40)题参见“第3章 创建型模式实训”选择题第(26)题(第68页),第(41)题参见“第4章 结构型模式实训”选择题第(6)题(第112页),第(43)题和第(44)题参见“第5章 行为型模式实训”选择题第(18)题(第190页)。
下午试题:
近年来,下午试题的最后一题通常会考查设计模式,由于C++与Java题基本相同,下面以Java版试题为例:
试题六(共15分)
阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示:
咖啡 | 价格/杯(¥) | 配料 | 价格/份(¥) |
蒸馏咖啡(Espresso) | 25 | 摩卡(Mocha) | 10 |
深度烘焙咖啡(DarkRoast) | 20 | 奶泡(Whip) | 8 |
现采用装饰器(Decorator)模式来实现计算费用的功能,得到如下图所示的类图。
【Java代码】
import java.util.*;
(1) class Beverage { //饮料
String description = "Unknown Beverage";
public (2) () {return description;}
public (3) ;
}
abstract class CondimentDecorator extends Beverage { //配料
(4) ;
}
class Espresso extends Beverage { //蒸馏咖啡
private final int ESPRESSO_PRICE = 25;
public Espresso() { description="Espresso"; }
public int cost() { return ESPRESSO_PRICE; }
}
class DarkRoast extends Beverage { //深度烘焙咖啡
private final int DARKROAST_PRICE = 20;
public DarkRoast() { description = "DarkRoast"; }
public int cost() { return DARKROAST PRICE; }
}
class Mocha extends CondimentDecorator { //摩卡
private final int MOCHA_PRICE = 10;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public int cost() {
return MOCHA_PRICE + beverage.cost();
}
}
class Whip extends CondimentDecorator { //奶泡
private final int WHIP_PRICE = 8;
public Whip(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() +", Whip";
}
public int cost() { return WHIP_PRICE + beverage.cost(); }
}
public class Coffee {
public static void main(String args[]) {
Beverage beverage = new DarkRoast();
beverage=new Mocha( 5 );
beverage=new Whip ( 6 );
System.out.println(beverage.getDescription() +"¥" +beverage.cost());
}
}
编译运行上述程序,其输出结果为:
DarkRoast, Mocha, Whip ¥38
本题答案如下:
(1) abstract
(2) String getDescription
(3) abstract int cost()
(4) Beverage beverage或protected Beverage beverage
(5) beverage
(6) beverage
本题在《设计模式实训教程》(刘伟,清华大学出版社,2012年1月)一书中对应题(参见“第6章 模式联用与综合实例实训”之实训练习第15题)如下:
15. There is a coffee shop to server HouseBlend and Espresso coffee. Each coffee can be served with the following condiments: Milk, Mocha. Using Decorator pattern to construct the coffee shop program to compute every beverage’s cost with its description.
abstract class Beverage { public abstract String getDescription(); public abstract double getCost(); } |
Draw the pattern class diagram, and full code (class CondimentDecorator, HouseBlend, Espresso,Milk, Mocha, StarBuzzCoffee and other classes required) to construct the program including a test drive (StarBuzzCoffee class).
【译:有一家咖啡店提供HouseBlend咖啡和Espresso咖啡。每一种咖啡需要用到如下配料:牛奶,摩卡。使用装饰模式构建咖啡店程序,输出其描述并计算每种饮料的花费。
abstract class Beverage { public abstract String getDescription(); public abstract double getCost(); } |
画出模式类图,实现完整的代码(包括类CondimentDecorator,HouseBlend, Espresso, Milk, Mocha, StarBuzzCoffee以及其他所需的类)构建程序,包括一个测试驱动类(StarBuzzCoffee类)。】
试题分析及解答如下:
本题使用装饰模式设计的类图如下所示:
在该类图中,Beverage充当抽象组件,HouseBlend和Espresso充当具体组件,CondimentDecorator充当抽象装饰器,Milk和Mocha充当具体装饰器,StarBuzzCoffee充当客户端。本题完整代码示例如下所示:
abstract class Beverage //抽象组件
{
public abstract String getDescription();
public abstract double getCost();
}
class HouseBlend extends Beverage //具体组件
{
public String getDescription()
{
return "HouseBlend咖啡";
}
public double getCost()
{
return 10.00;
}
}
class Espresso extends Beverage //具体组件
{
public String getDescription()
{
return "Espresso咖啡";
}
public double getCost()
{
return 20.00;
}
}
class CondimentDecorator extends Beverage //抽象装饰器
{
private Beverage beverage;
public CondimentDecorator(Beverage beverage)
{
this.beverage = beverage;
}
public String getDescription()
{
return beverage.getDescription();
}
public double getCost()
{
return beverage.getCost();
}
}
class Milk extends CondimentDecorator //具体装饰器
{
public Milk(Beverage beverage)
{
super(beverage);
}
public String getDescription()
{
String decription = super.getDescription();
return decription + "加牛奶";
}
public double getCost()
{
double cost = super.getCost();
return cost + 2.0;
}
}
class Mocha extends CondimentDecorator //具体装饰器
{
public Mocha(Beverage beverage)
{
super(beverage);
}
public String getDescription()
{
String decription = super.getDescription();
return decription + "加摩卡";
}
public double getCost()
{
double cost = super.getCost();
return cost + 3.0;
}
}
class StarBuzzCoffee //客户端测试类
{
public static void main(String args[])
{
String decription;
double cost;
Beverage beverage_e;
beverage_e = new Espresso();
decription = beverage_e.getDescription();
cost = beverage_e.getCost();
System.out.println("饮料:" + decription);
System.out.println("价格:" + cost);
System.out.println("---------------------");
Beverage beverage_mi;
beverage_mi = new Milk(beverage_e);
decription = beverage_mi.getDescription();
cost = beverage_mi.getCost();
System.out.println("饮料:" + decription);
System.out.println("价格:" + cost);
System.out.println("---------------------");
Beverage beverage_mo;
beverage_mo = new Mocha(beverage_mi);
decription = beverage_mo.getDescription();
cost = beverage_mo.getCost();
System.out.println("饮料:" + decription);
System.out.println("价格:" + cost);
System.out.println("---------------------");
}
}
//输出结果如下:
//饮料:Espresso咖啡
//价格:20.0
//---------------------
//饮料:Espresso咖啡加牛奶
//价格:22.0
//---------------------
//饮料:Espresso咖啡加牛奶加摩卡
//价格:25.0
【作者:刘伟 http://blog.csdn.net/lovelion】