外观模式,当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些额外的功能。
第1题:
● 已知某子系统为外界提供功能服务,但该子系统中存在很多粒度十分小的类,不便被外界系统直接使用,采用(41)设计模式可以定义一个高层接口,这个接口使得这一子系统更加容易使用;当不能采用生成子类的方法进行扩充时,可采用(42)设计模式动态地给一个对象添加一些额外的职责。
(41)
A. Facade(外观)
B. Singleton(单件)
C. Participant(参与者)
D. Decorator(装饰)
(42)
A. Facade(外观)
B. Singleton(单件)
C. Participant(参与者)
D. Decorator(装饰)
第2题:
●欲动态地给一个对象添加职责,宜采用 (43)模式。
(43)
A.适配器(Adapter)
B.桥接(Bridge)
C.组合( Composite)
D.装饰器(Decorator)
第3题:
Decorator模式的结构图如图13-4所示。关于其说法不正确的是(50)。
A.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
B.在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责。
C.Decorator模式的两个主要优点是:比静态继承更灵活,避免在层次结构高层的类有太多的特征。
D.Decorator模式是一种行为模式。
第4题:
● 当不适合采用生成子类的方法对已有的类进行扩充时,可以采用 (43) 设计模式动态地给一个对象添加一些额外的职责;当应用程序由于使用大量的对象,造成很大的存储开销时,可以采用 (44) 设计模式运用共享技术来有效地支持大量细粒度的对象;当想使用一个已经存在的类,但其接口不符合需求时,可以采用 (45) 设计模式将该类的接口转换成我们希望的接口。
(43)
A. 命令(Command)
B. 适配器(Adapter)
C. 装饰(Decorate)
D. 享元(Flyweight)
(44)
A. 命令(Command)
B. 适配器(Adapter)
C. 装饰(Decorate)
D. 享元(Flyweight)
(45)
A. 命令(Command)
B. 适配器(Adapter)
C. 装饰(Decorate)
D. 享元(Flyweight)
第5题:
第6题:
第7题:
第8题:
以下哪种设计模式能够支持动态地给一个对象增加其他职责而且在职责整合时支持热插拔()
第9题:
上转型对象具有如下()特点。
第10题:
对
错
第11题:
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
处理那些可以撤消的职责
客户程序与抽象类的实现部分之间存在着很大的依赖性
当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类
第12题:
第13题:
阅读以下说明和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,边界宽为1
window->SetContents((5));
}
第14题:
● 欲动态地给一个对象添加职责,宜采用(46)模式。 A.适配器(Adapter) B.桥接(Bridge)C.组合( Composite) D.装饰器(Decorator)
第15题:
已知某子系统为外界提供功能服务,但该子系统中存在很多粒度十分小的类,不便被外界系统直接使用,采用(41)设计模式可以定义一个高层接口,这个接口使得这一子系统更加容易使用;当不能采用生成子类的方法进行扩充时,可采用(42)设计模式动态地给一个对象添加一些额外的职责。
A.Facade(外观)
B.Singleton(单件)
C.Participant(参与者)
D.Decorator(装饰)
第16题:
● 下面给出了四种设计模式的作用:
外观(Facade):为子系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用
装饰(Decorate):当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些额外的功能;
单件(Singleton) :保证一个类仅有一个实例,并提供一个访问它的全局访问点;
模板方法(Template Method):在方法中定义算法的框架,而将算法中的一些操作步骤延迟到子类中现。请根据下面叙述的场景选用适当的设计模式。若某面向对象系统中的某些类有且只有一个实例,那么采用(42)设计模式能够有效达到该目的;该系统中的某子模块需要为其它模块提供访问不同数据库系统(Oracle、SQL Server、DB2 UDB 等)的功能,这些数据库系统提供的访问接口有一定的差异,但访问过程却都是相同的,例如,先连接数据库,再打开数据库,最后对数据进行查询,(43) 设计模式可抽象出相同的数据库访问过程;系统中的文本显示类(TextView)和图片显示类(PictureView)都继承了组件类
(Component),分别显示文本和图片内容,现需要构造带有滚动条、或者带有黑色边框、或者既有滚动条又有黑色边框的文本显示控件和图片显示控件,但希望最多只增加三个类,(44)设计模式可以实现该目的。
(42)A. 外观 B. 装饰 C. 单件 D. 模板方法
(43)A. 外观 B. 装饰 C. 单件 D. 模板方法
(44)A. 外观 B. 装饰 C. 单件 D. 模板方法
第17题:
第18题:
第19题:
欲动态地给一个对象添加职责,宜采用()模式。
第20题:
关于模式适用性,在以下情况不适合使用DECORATOR(装饰)模式?()
第21题:
以下不适合使用装饰模式的是()
第22题:
装饰某个对象时需要修改该类的对象
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
需要动态地给一个对象增加功能,这些功能也可以动态地被撤销
当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时
只需要对某个对象进行外观修饰而不需要修改其内在属性时
第23题:
桥接模式(Bridge)
装饰模式(Decorator)
享元模式(Flyweight)
外观模式(Facade)