网友您好, 请在下方输入框内输入要搜索的题目:

题目内容 (请给出正确答案)

阅读下列说明与相关类图,填空并回答问题。

【说明】

装饰者模式动态地给一个对象添加一些额外的职责,就扩展功能而言,该模式比生成子类方式更加灵活。装饰模式的提出有助于解决滥用继承的问题。

例如,一个名叫星巴兹(Starbuzz)的咖啡连锁店提供多种多样的咖啡,最朴素的设计就是采用继承,即设计一个饮料抽象基类Beverage,让不同种类的咖啡HouseBlend、 Decaf、Espresso、DarkRoast继承Beverage类,如图13-23所示。Beverage类的cost()方法是抽象方法,每个子类的cost()方法实现即返回具体咖啡种类的价钱,Beverage类的 description实例变量由每个子类设置,用来描述该类饮料,Beverage类的getDescription()方法用来返回此描述。

客户在点咖啡时还可以要求添加各种各样的调料(Condiment),加入的调料不同所收取的费用也是不同的,让各种加了调料的不同咖啡都继承基类Beverage,当咖啡种类和调料种类很多时,组合种类的数量就会急剧增长,就会发生“类数量爆炸”现象,如图13-24所示。

显然,采用这种设计方式会使得代码的维护变得十分困难,可以采用装饰者模式来解决这个问题。软件设计师蝴蝶飞根据装饰者模式的思想设计了如图13-25所示的类图。

在图13-25中,将各种调料Milk、Mocha、Soy、Whip作为装饰者来装饰House- Blend、Decal、Espresso、DarkRoast等各种咖啡。下面的Java程序(代码13-6)对应其具体实现。

【代码13-6】

import java.io.* ;

abstract class Beverage{

String description="Unknown Beverage";

public String getDescription(){

return description;

}

public (1) double cost();

}

abstract class CondimentDecorator (2) Beverage {

public abstract Strmg getDescription();

}

class Decafextends Beverage {

public Decaf(){

description="Decaf Coffee";

}

public double cost(){

return 1.05;

}

}

class Espresso extends Beverage {

public Espresso() {

description="Espresso";

}

public double cost(){

return 1.99;

}

}

class HouseBlend extends Beverage{

public HouseBlend(){

description="House Blend Coffee";

}

public double cost(){

return.89;

}

}

class DarkRoast extends Beverage{

public DarkRoast(){

description="Dark Roast Coffee";

}

public double cost(){

return.99;

}

}

class Mocha extends CondtmentDecorator{

Beverage (3);

public Mocha(Beverage beverage){

this.beverage=beverage;

}

public String getDescription(){

return beverage.getDescription()+", Mocha";

}

public double cost(){

return.20+beverage.cost();

}

}

Class Soy extends CondimentDecorator{

Beverage beverage;

public Soy(Beverage beverage) {

this.beverage=beverage;

}

public Strillg getDescription(){


参考答案

更多 “ 阅读下列说明与相关类图,填空并回答问题。【说明】装饰者模式动态地给一个对象添加一些额外的职责,就扩展功能而言,该模式比生成子类方式更加灵活。装饰模式的提出有助于解决滥用继承的问题。例如,一个名叫星巴兹(Starbuzz)的咖啡连锁店提供多种多样的咖啡,最朴素的设计就是采用继承,即设计一个饮料抽象基类Beverage,让不同种类的咖啡HouseBlend、 Decaf、Espresso、DarkRoast继承Beverage类,如图13-23所示。Beverage类的cost()方法是抽象方法,每个子类的cost()方法实现即返回具体咖啡种类的价钱,Beverage类的 description实例变量由每个子类设置,用来描述该类饮料,Beverage类的getDescription()方法用来返回此描述。客户在点咖啡时还可以要求添加各种各样的调料(Condiment),加入的调料不同所收取的费用也是不同的,让各种加了调料的不同咖啡都继承基类Beverage,当咖啡种类和调料种类很多时,组合种类的数量就会急剧增长,就会发生“类数量爆炸”现象,如图13-24所示。显然,采用这种设计方式会使得代码的维护变得十分困难,可以采用装饰者模式来解决这个问题。软件设计师蝴蝶飞根据装饰者模式的思想设计了如图13-25所示的类图。在图13-25中,将各种调料Milk、Mocha、Soy、Whip作为装饰者来装饰House- Blend、Decal、Espresso、DarkRoast等各种咖啡。下面的Java程序(代码13-6)对应其具体实现。【代码13-6】import java.io.* ;abstract class Beverage{String description="Unknown Beverage";public String getDescription(){return description;}public (1) double cost();}abstract class CondimentDecorator (2) Beverage {public abstract Strmg getDescription();}class Decafextends Beverage {public Decaf(){description="Decaf Coffee";}public double cost(){return 1.05;}}class Espresso extends Beverage {public Espresso() {description="Espresso";}public double cost(){return 1.99;}}class HouseBlend extends Beverage{public HouseBlend(){description="House Blend Coffee";}public double cost(){return.89;}}class DarkRoast extends Beverage{public DarkRoast(){description="Dark Roast Coffee";}public double cost(){return.99;}}class Mocha extends CondtmentDecorator{Beverage (3);public Mocha(Beverage beverage){this.beverage=beverage;}public String getDescription(){return beverage.getDescription()+", Mocha";}public double cost(){return.20+beverage.cost();}}Class Soy extends CondimentDecorator{Beverage beverage;public Soy(Beverage beverage) {this.beverage=beverage;}public Strillg getDescription(){ ” 相关考题
考题 ● 已知某子系统为外界提供功能服务,但该子系统中存在很多粒度十分小的类,不便被外界系统直接使用,采用(41)设计模式可以定义一个高层接口,这个接口使得这一子系统更加容易使用;当不能采用生成子类的方法进行扩充时,可采用(42)设计模式动态地给一个对象添加一些额外的职责。(41)A. Facade(外观)B. Singleton(单件)C. Participant(参与者)D. Decorator(装饰)(42)A. Facade(外观)B. Singleton(单件)C. Participant(参与者)D. Decorator(装饰)

考题 阅读以下说明和C++程序代码,将程序填充完整。【说明】有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可能在转发前后执行一些额外的动作(例如画二个边框)。透明性使得你可以递归地嵌套多个装饰,从而可以添加任意多的功能。装饰对象结构模式的意图就是动态地给一个对象添加一些额外的职责。就增加功能来说,该模式相比生成子类更为灵活。其示意类图如图13-22所示。程序代码13-5是该模式的一个示例,说明了如何实现用户接口装饰,函数的实现全部省略。程序中定义了VisualComponent的一个子类Decorator,我们将生成Decorator的子类以获取不同的装饰。VisualComponent类是一个描述可视对象的抽象类,它描述了绘制和事件处理的接口。Decorator的子类定义了特殊的装饰功能,BorderDecorator子类给可视组件添加一个边框,ScrollDecorator给可视组件添加滚动功能。【程序代码13-5】(1);class Window{public:roid SetContents (VisualComponent * contents);};//VisualComponent类是一个描述可视对象的抽象类class VisllalComponent{public:VisualComponent(){};(2) void Draw(){};Virtual void Resize(){};};class Decorator:public VisualComponent{public:Decorator(){//…};Decorator(VisualComponent * vcom){//…};virtual vold Draw();virtual vold Resize();private:/* Decorator装饰由VisualComponent的指针实现,其在Decorator的构造函数中初始化*/VisualComponent (3) ;};vold Decorator::Draw(){(4);//缺省实现}void Decorator::Resize(){component->Resize();//缺省实现}//BorderDecorator 子类为它所包含的组件添加一个边框class BorderDecorator:public Decorator{public:BorderDecorator(VisualComponent * vcom,int borderWidth){//…};Virtual Void Draw();private:void DrawBorder(int);private:int borderWidth;};void BorderDecorator::Draw(){Decorator::Draw();DrawBorder(_width);}Void BorderDecorator::DrawBorder(int Width){//…)Void Window::SetConterlts(VlsualComponent * contents){//…}//SerollDecorat 给可视组件添加滚动功能class ScroliDecoratOr:public Decorator{public:ScrollDecorator(VlsualComponent * vcom){//…};//…);class TextView:public VisualComponent{//…};void main(void){//创建一个正文视图以及放入这个正文视图的窗口Window * window=new Window;TcxtView * textView=new TextView;//TextView是一个VisualComponent,它可以放入窗口中window->SetContents(textView);//得到一个有边界的和可以滚动的TextView,边界宽为1window->SetContents((5));}

考题 Decorator模式的结构图如图13-4所示。关于其说法不正确的是(50)。A.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。B.在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责。C.Decorator模式的两个主要优点是:比静态继承更灵活,避免在层次结构高层的类有太多的特征。D.Decorator模式是一种行为模式。

考题 已知某子系统为外界提供功能服务,但该子系统中存在很多粒度十分小的类,不便被外界系统直接使用,采用(41)设计模式可以定义一个高层接口,这个接口使得这一子系统更加容易使用;当不能采用生成子类的方法进行扩充时,可采用(42)设计模式动态地给一个对象添加一些额外的职责。A.Facade(外观)B.Singleton(单件)C.Participant(参与者)D.Decorator(装饰)

考题 ( )设计模式能够动态地给一个对象添加一些额外的职责而无需修改此对象的结构A.组合(Composite) B.外观(Facade) C.享元(Flyweight) D.装饰器(Decorator)

考题 ( )设计模式能够动态地给一个对象添加一些额外的职责而无须修改此对象的结构;( )设计模式定义一个用于创建对象的接口,让子类决定实例化哪一个类;欲使一个后端数据模型能够被多个前端用户界面连接,采用(请作答此空)模式最适合。A. 装饰器 B. 享元 C. 观察者 D. 中介者

考题 (请作答此空)设计模式能够动态地给一个对象添加一些额外的职责而无须修改此对象的结构;()设计模式定义一个用于创建对象的接口,让子类决定实例化哪一个类;欲使一个后端数据模型能够被多个前端用户界面连接,采用()模式最适合。A. 组合 B. 外观 C. 享元 D. 装饰器

考题 装饰器模式的优点是()。A.装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性B.装饰模式允许系统动态地决定贴上装饰,或者除掉一个不需要的装饰,继承则不同,继承是静态的,它在系统运行前就决定了C.通过使用不同的具体装饰类以这些装饰类的排列组合,设计师可以创造出很我不同行为的组合D.这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加容易出错

考题 1、当不能采用生成子类的方法进行扩展时,可采用()模式动态地给要给对象添加一些额外的职责。A.外观模式B.单例模式C.参与者模式D.装饰模式