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

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

           2012年上半年软件设计师之设计模式相关试题及解答_第1张图片                  

       (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)模式来实现计算费用的功能,得到如下图所示的类图。

2012年上半年软件设计师之设计模式相关试题及解答_第2张图片

【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类)。】

 

        试题分析及解答如下:

        本题使用装饰模式设计的类图如下所示:

2012年上半年软件设计师之设计模式相关试题及解答_第3张图片

   在该类图中,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

你可能感兴趣的:(2012年上半年软件设计师之设计模式相关试题及解答)