CMS专题

单选题当不适合采用生成子类的方法对已有的类进行扩充时,可以采用(1)设计模式动态地给一个对象添加一些额外的职责;当应用程序由于使用大量的对象,造成很大的存储开销时,可以采用(2)设计模式运用共享技术来有效地支持大量细粒度的对象;当想使用一个已经存在的类,但其接口不符合需求时,可以采用(3)设计模式将该类的接口转换成我们希望的接口。 空白(1)处应选择()A 命令(CommanD)B 适配器(Adapter)C 装饰(DecoratE)D 享元(Flyweight)

题目
单选题
当不适合采用生成子类的方法对已有的类进行扩充时,可以采用(1)设计模式动态地给一个对象添加一些额外的职责;当应用程序由于使用大量的对象,造成很大的存储开销时,可以采用(2)设计模式运用共享技术来有效地支持大量细粒度的对象;当想使用一个已经存在的类,但其接口不符合需求时,可以采用(3)设计模式将该类的接口转换成我们希望的接口。 空白(1)处应选择()
A

命令(CommanD)

B

适配器(Adapter)

C

装饰(DecoratE)

D

享元(Flyweight)

如果没有搜索结果,请直接 联系老师 获取答案。
如果没有搜索结果,请直接 联系老师 获取答案。
相似问题和答案

第1题:

采用( )设计模式可保证一个类仅有一个实例;采用( )设计模式可将对象组合成树形结构以表示“部分一整体”的层次结构,使用户对单个对象和组合对象的使用具有一致性;采用( )设计模式可动态地给一个对象添加一些额外的职责。

A.命令(Command)

B.单例(Singleton)

C.装饰(Deeorate)

D.组合(Composite)(44)


正确答案:B
解析:试题43:在面向对象程序设计的范畴中,命令模式是一种设计模式,它尝试以物件来代表实际行动。命令物件可以把行动(action)及其参数封装起来。试题44:组合模式有时候又叫做部分一整体模式,它使我们在树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。试题45:装饰设计模式可动态地给一个对象添加一些额外的职责。

第2题:

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

(41)

A. Facade(外观)

B. Singleton(单件)

C. Participant(参与者)

D. Decorator(装饰)

(42)

A. Facade(外观)

B. Singleton(单件)

C. Participant(参与者)

D. Decorator(装饰)


正确答案:A,D


第3题:

欲动态地给一个对象添加职责,宜采用()模式。

A.适配器(Adapter)

B.桥接(BridgE.

C.组合(CompositE.

D.装饰器(Decorator)


参考答案:D
适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰器(Decorator)都是结构型设计模式,用于处理类或对象的组合。适配器使得一个接口与其他接口兼容,从而给出了多个不同接口的统一抽象;桥接模式将对象的抽象和其实现分离;组合模式描述了如何构造一个类层次式结构;装饰器模式描述了如何动态地为对象添加职责。

第4题:

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

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

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

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

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


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

第5题:

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

}


正确答案:(1)class VisualComponent (2)virtual (3)* component (4)component->Draw() (5)new BorderDecorator(new ScrollDecorator(textView)1)
(1)class VisualComponent (2)virtual (3)* component (4)component->Draw() (5)new BorderDecorator(new ScrollDecorator(textView),1) 解析:装饰者模式适合以下情况:
(1)在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责。
(2)处理那些可以撤消的职责。
(3)当不能采用生成子类的方法进行扩充时,有两种情况:一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;另一种情况可能是,因为类定义被隐藏,或类定义不能用于生成子类。
题目给出的程序代码以如何获得一个带边框和滚动条的正文视图窗口为例说明了该模式,其中的具体实现全部省略。题中给出的示意类图是该模式通用的结构示意。程序代码涉及的类结构如图13-53所示。

其中,ScrollDecorator、BorderDecorator分别相当于题目中通用结构图中的ConcreteDecoratorA、 ConcreteDecoratorB,它们的职责就是向组件添加相应的功能。
程序代码中,Decorator装饰由VisualComponent的指针component实现,对于Visual Component接口中定义的每一个操作,Decorator类都定义了一个缺省的实现,这一实现将相关请求转发给component,因此第(3)、(4)空分别填:* component、component-> Draw()。
类VisualComponent在Window之后定义,而在Window类中使用了VisualComponent类,所以先要声明该类,因此,第(1)空填:class VisualComponent。VisualComponent类是个抽象类,它是一个界面,它的方法应声明为虚函数,具体实现交由其子类实现,因此,第(2)空填:virtual。
第(5)空有点难度,根据注释“TextView是一个VisualComponent,它可以放入窗口中”可知,Window的方法SetContents参数是一个VisualComponent对象,现需要获得一个有边界的和可以滚动的TextView,边界宽为1,因此要创建一个新的ScrollDecorator对象,将textView放入其中,然后以其为第一个参数构造一个BorderDecorator对象,然后把这个BorderDecorator对象放入到窗口中去即可,因此,该空应填:new BorderDecorator (new ScrollDecorator(textView),1)。

第6题:

当不适合采用生成子类的方法对已有的类进行扩充时,可以采用( )没计模式动态地给一个对象添加一些额外的职责;当应用程序由于使用大量的对象,造成很大的存储开销时,可以采用( )设计模式运用共享技术来有效地支持大量细粒度的对象;当想使用一个已经存在的类,但其接口不符合需求时,可以采用( )设计模式将该类的接口转换成我们希望的接口。

A.命令(Command)

B.适配器(Adapter)

C.装饰(Decorate)

D.享元(Flyweight)


正确答案:C
解析:装饰模式主要的目的是在无法生成子类的情况下给一个对象动态地增加新的职责;享元设计模式是共享大量细粒度的对象;适配器设计模式则是将已有的接口转换为系统希望的接口形式。

第7题:

● 下面给出了四种设计模式的作用: 外观(Fa?ade) :为子系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用; 装饰(Decorate):当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些额外的功能; 单件(Singleton) :保证一个类仅有一个实例,并提供一个访问它的全局访问点; 模板方法(Template Method) :在方法中定义算法的框架,而将算法中的一些操作步骤延迟到子类中实现。 请根据下面叙述的场景选用适当的设计模式。若某面向对象系统中的某些类有且只有一个实例,那么采用(30) 设计模式能够有效达到该目的;该系统中的某子模块需要为其他模块提供访问不同数据库系统(Oracle、SQL Server、DB2 UDB 等)的功能,这些数据库系统提供的访问接口有一定的差异,但访问过程却都是相同的,例如,先连接数据库、再打开数据库、最后对数据进行查询,(31) 设计模式可抽象出相同的数据库访问过程;系统中的文本显示类(TextView)和图片显示类(PictureView)都继承了组件类(Component),分别显示文本和图片内容,现需要构造带有滚动条、或者带有黑色边框、或者既有滚动条又有黑色边框的文本显示控件和图片显示控件,但希望最多只增加三个类,(32) 设计模式可以实现该目的。

(30)A. 外观 B. 装饰 C. 单件 D. 模板方法

(31)A. 外观 B. 装饰 C. 单件 D. 模板方法

(32)A. 外观 B. 装饰 C. 单件 D. 模板方法


正确答案:C,D,B


第8题:

● 采用 (43) 设计模式可保证一个类仅有一个实例;采用 (44) 设计模式可将对象组合成树形结构以表示“部分-整体”的层次结构, 使用户对单个对象和组合对象的使用具有一致性;采用 (45) 设计模式可动态地给一个对象添加一些额外的职责。

(43)A. 命令(Command) B. 单例(Singleton) C. 装饰(Decorate) D. 组合(Composite)

(44)A. 命令(Command) B. 单例(Singleton) C. 装饰(Decorate) D. 组合(Composite)

(45)A. 命令(Command) B. 单例(Singleton) C. 装饰(Decorate) D. 组合(Composite)


正确答案:B,D,C
试题(43)~(45)分析
  本题考查面向对象设计中的设计模式。
  单例设计模式的目的就是保证一个类仅能够生成一个对象;组合设计模式则用于表示“部分-整体”的层次结构,并且对部分和整体的使用具有一致性;装饰设计模式则动态地给一个对象增加一些额外的职责,无须改变类的设计和实现。
参考答案
(43)B(44)D(45)C

 

第9题:

●欲动态地给一个对象添加职责,宜采用 (43)模式。

(43)

A.适配器(Adapter)

B.桥接(Bridge)

C.组合( Composite)

D.装饰器(Decorator)


正确答案:D

第10题:

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

A.Facade(外观)

B.Singleton(单件)

C.Participant(参与者)

D.Decorator(装饰)


正确答案:A

更多相关问题