(2012年上半年下午试题六)阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某咖啡店卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价

admin2018-07-27  18

问题 (2012年上半年下午试题六)阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
    【说明】
    某咖啡店卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表10.10所示。

现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图10.30所示的类图。

【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 (5)beverage (6)beverage

解析 装饰器模式描述了如何动态地为一个对象添加职责。该模式采用递归方式组合对象,从而允许添加任意多的对象职责。在下列情况下可以使用装饰器模式。
  (1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  (2)处理那些可以撤销的职责。
  (3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
    装饰器模式的结构如图10.31所示。图中各部分说明如下。

    抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这些对象动态地添加职责。
    具体组件角色(ConcreteComponent):被装饰者,定义一个将要被装饰增加功能的类。可以给这个类的对象添加一些职责。
抽象装饰器(Decorator):维持一个指向构件Component对象的实例,并定义一个与抽象组件角色(Component、胺口一致的接口。
    具体装饰器角色(ConcreteDecorator):向组件添加职责。
    图10.30中的.Beverage对应的就是图10.31中的抽象类Component,Espresso和DarkRoast对应的是ConcreteComponent,CondimentDecorator对应的是Decorator,Mocha和Whip扮演的是类CondimentDecorator的具体装饰器角色ConcreteDecorator。
    由于类Beverage为其子类提供了统一的操作接口,所以将其定义为抽象类。可以通过在类名前加abstract关键字来定义抽象类,因此空(1)处应填入abstract。
    空(2)处和空(3)处考查构造函数的定义。从空(2)处构造函数体中返回值的类型及后续的子类继承程序可知,空(2)处应填入String getDescription;从public int cost(){return ESPRESSO PRICE;}可以看出,cost()函数的返回值为常量,因此空(3)处应填入abstract intcost()。
    空(4)处考查对CondimentDecorator的定义,在该类中声明一类成员变量,并在this.beverage=beverage和return beverage.getDescription()+’’,Mocha’’中加以使用。因此空(4)处应填入Beverage beverage。
    空(5)处和空(6)处考查实例化类模板的方法。类模板必须在实例化后才能使用。实例化类模板时,要给出类型实参。从类图可知,空(5)处和空(6)处均应填入beverage。
转载请注明原文地址:https://kaotiyun.com/show/d7DZ777K
0

相关试题推荐
随机试题
最新回复(0)