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

题目

Decorator模式的结构图如图13-4所示。关于其说法不正确的是(50)。

A.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

B.在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责。

C.Decorator模式的两个主要优点是:比静态继承更灵活,避免在层次结构高层的类有太多的特征。

D.Decorator模式是一种行为模式。


相似考题

2.阅读以下说明和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));}

参考答案和解析
正确答案:D
解析:Decorator模式是一种对象结构模式,用于描述对象之间的结构关系,从题中的结构图可看出,它并不描述对象的行为。Decorator模式的意图是动态地给一个对象添加一些额外的职责。就增加功能来说,该模式相比生成子类更为灵活。它适用于以下情况:①在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责。②处理那些可以撤消的职责。③当不能采用生成子类的方法进行扩充时,有两种情况:一种情况可能是有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
更多“ Decorator模式的结构图如图13-4所示。关于其说法不正确的是(50)。A.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。B.在不影响其它对象的情况下,以动”相关问题
  • 第1题:

    ● 欲动态地给一个对象添加职责,宜采用(46)模式。 A.适配器(Adapter) B.桥接(Bridge)C.组合( Composite) D.装饰器(Decorator)


    正确答案:D
    试题46分析适配器模式将一个接口转换成为客户想要的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。桥接模式将抽象部分与实现部分分离,使得它们两部分可以独立地变化。合成模式组合多个对象形成树型结构以表示整体—部分的结构层次。装饰器模式动态地给一个对象增加其他职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。参考答案(46)D

  • 第2题:

    下图是( )设计模式的类图,该设计模式的目的是(请作答此空),图中,Decorator和Component之间是( )关系,ConcreteDecorator和Decorator之间是( )关系。

    A.将一个类的接口转换为客户期望的另一种接口,使得原本因接口不匹配而无法合作的类可以一起工作
    B.将一个抽象与其实现分离开,以便两者能够各自独立地演变
    C.为一个对象提供代理以控制该对象的访问
    D.动态地给一个对象附加额外的职责,不必通过子类就能灵活地增加功能

    答案:D
    解析:
    图中Component定义一个对象接口,可以给这些对象动态地添加职责ConcreteComponent定义一个对象,可以给这个对象添加一些职责Decorator维持一个指向Compnonent对象的指针,并定义一个与Component接口-致的接口ConcreateDecorator向组件添加职责装饰(Decorator)模式适应于:在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责;处理那些可以撤销的职责;当不能采用生成子类的方式进行扩充时Decorator和Component之间应为关联与实现关系ConcreteDecorator和Decorator之间是继承(泛化)关系

  • 第3题:

    1、当不能采用生成子类的方法进行扩展时,可采用()模式动态地给要给对象添加一些额外的职责。

    A.外观模式

    B.单例模式

    C.参与者模式

    D.装饰模式


    错误

  • 第4题:

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

    A.Facade(外观)

    B.Singleton(单件)

    C.Participant(参与者)

    D.Decorator(装饰)


    正确答案:A

  • 第5题:

    ( )设计模式能够动态地给一个对象添加一些额外的职责而无需修改此对象的结构

    A.组合(Composite)
    B.外观(Facade)
    C.享元(Flyweight)
    D.装饰器(Decorator)

    答案:D
    解析:
    抽象工厂模式(Abstract Factory):提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类
    构建器模式(Builder):将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示
    工厂方法模式(Factory Method):定义一个创建对象的接口,但由子类决定需要实例化哪一个类工厂方法使得子类实例化的过程推迟
    原型模式(Prototype):用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象
    单例模式(Singleton):保证一个类只有一个实例,并提供一个访问它的全局访问点
    适配器模式(Adapter):将一个类的接口转换成用户希望得到的另一种接口它使原本不相容的接口得以协同工作
    桥接模式(Bridge):将类的抽象部分和它的实现部分分离开来,使它们可以独立地变化
    组合模式(Composite):将对象组合成树型结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
    装饰模式(Decorator):动态地给一个对象添加一些额外的职责它提供了用子类扩展功能的一个灵活的替代,比派生一个子类更加灵活
    外观模式(Facade):定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了该子系统的使用
    享元模式(Flyweight):提供支持大量细粒度对象共享的有效方法
    代理模式(Proxy):为其他对象提供一种代理以控制这个对象的访问
    职责链模式(Chain of)