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充当客户端。本题完整代码示例如下所示:

[java]   view plain copy
  1. abstract class Beverage    //抽象组件  
  2. {  
  3.     public abstract String getDescription();  
  4.     public abstract double getCost();  
  5. }  
  6.   
  7. class HouseBlend extends Beverage    //具体组件  
  8. {  
  9.     public String getDescription()   
  10.     {   
  11.         return "HouseBlend咖啡";   
  12.     }  
  13.     public double getCost()   
  14.     {  
  15.         return 10.00;   
  16.     }  
  17. }  
  18.   
  19. class Espresso extends Beverage    //具体组件  
  20. {  
  21.     public String getDescription()   
  22.     {   
  23.         return "Espresso咖啡";   
  24.     }  
  25.     public double getCost()   
  26.     {  
  27.         return 20.00;   
  28.     }  
  29. }  
  30.   
  31. class CondimentDecorator extends Beverage    //抽象装饰器  
  32. {  
  33.     private Beverage beverage;  
  34.     public CondimentDecorator(Beverage beverage)  
  35.     {  
  36.         this.beverage = beverage;  
  37.     }  
  38.     public String getDescription()   
  39.     {   
  40.         return beverage.getDescription();   
  41.     }  
  42.     public double getCost()   
  43.     {  
  44.         return beverage.getCost();   
  45.     }  
  46. }  
  47.   
  48. class Milk extends CondimentDecorator    //具体装饰器  
  49. {  
  50.     public Milk(Beverage beverage)  
  51.     {  
  52.         super(beverage);  
  53.     }  
  54.     public String getDescription()   
  55.     {   
  56.         String decription = super.getDescription();  
  57.         return decription + "加牛奶";   
  58.     }  
  59.     public double getCost()   
  60.     {  
  61.         double cost = super.getCost();  
  62.         return cost + 2.0;   
  63.     }  
  64. }  
  65.   
  66. class Mocha extends CondimentDecorator    //具体装饰器  
  67. {  
  68.     public Mocha(Beverage beverage)  
  69.     {  
  70.         super(beverage);  
  71.     }  
  72.     public String getDescription()   
  73.     {   
  74.         String decription = super.getDescription();  
  75.         return decription + "加摩卡";   
  76.     }  
  77.     public double getCost()   
  78.     {  
  79.         double cost = super.getCost();  
  80.         return cost + 3.0;   
  81.     }     
  82. }  
  83.   
  84. class StarBuzzCoffee    //客户端测试类  
  85. {  
  86.     public static void main(String args[])  
  87.     {  
  88.         String decription;  
  89.         double cost;  
  90.         Beverage beverage_e;  
  91.           
  92.         beverage_e = new Espresso();  
  93.         decription = beverage_e.getDescription();  
  94.         cost = beverage_e.getCost();  
  95.         System.out.println("饮料:" + decription);  
  96.         System.out.println("价格:" + cost);  
  97.         System.out.println("---------------------");  
  98.           
  99.         Beverage beverage_mi;  
  100.         beverage_mi = new Milk(beverage_e);  
  101.         decription = beverage_mi.getDescription();  
  102.         cost = beverage_mi.getCost();  
  103.         System.out.println("饮料:" + decription);  
  104.         System.out.println("价格:" + cost);  
  105.         System.out.println("---------------------");          
  106.   
  107.         Beverage beverage_mo;  
  108.         beverage_mo = new Mocha(beverage_mi);  
  109.         decription = beverage_mo.getDescription();  
  110.         cost = beverage_mo.getCost();  
  111.         System.out.println("饮料:" + decription);  
  112.         System.out.println("价格:" + cost);  
  113.         System.out.println("---------------------");          
  114.     }  
  115. }  
  116. //输出结果如下:  
  117. //饮料:Espresso咖啡  
  118. //价格:20.0  
  119. //---------------------  
  120. //饮料:Espresso咖啡加牛奶  
  121. //价格:22.0  
  122. //---------------------  
  123. //饮料:Espresso咖啡加牛奶加摩卡  
  124. //价格:25.0 

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