某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表17—2所示。 现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图17—5所示的类图。 [Java代

admin2014-11-13  13

问题 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表17—2所示。

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

[Java代码]
import j ava.util.*;
(1)class Beverage(//饮料
    String descript ion=“Unknown Beverage”;
    public  (2) ()(return description;)
    public  (3);
  }
  abstract class CondimentDecorator extends Beverage{//配料
    (4)   ;
}
class Espresso extends Beverage(//蒸馏咖啡
  private final int ESPRESSO—PRICE=25;
  pubiic Espresso()  (  description=”Espresso”;*}
  publ ic int cost()(return ESPRESSO—PRICE;)
}
class DarkRoast extends Beverage(//深度烘焙咖啡
private f inal int DARKROAST—PRICE=2 0;
publ ic DarkRoast()(descript ion=“DarkRoast”;}
public int cost()(rcturn DARKROAST PRICE;}
}
class Mocha extends CondimentDecorator{//摩卡
private final int MOCHA_PRICE=10;
public Mocha(Beverage beverage){
  this.beverage=beverage;
    }
    publ ic  String getDescript ion()  {
    return beverage.getDescription0  +  “,  Mocha”;
    }
    publ ic int cost(){
    return MOCHA—PRICE+beverage.cost();
    }
    }
    class Whil3 extends condimentDecorator  (  //奶泡
    private finalint WHIP_PRICE=8;
    publ ic Whip(Beverage beverage)(this.beverage=beverage;)
    publiC  String getDescrip七ion()  (
    return beverage.getDescrip七ion()+”,  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.print in(beverage.getDescrip七ion()  +。“¥”  +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)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
    装饰器模式的结构如图17—6所示。其中:

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

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