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

194 篇文章 13 订阅
189 篇文章 407 订阅

       设计模式已成为软件设计师考试试题的一个重要组成部分,每次考试中都会有将近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

目 录 序言 前言 读者指南 第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
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值