【说明】 有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具

题型:问答题

问题:

【说明】 有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。 一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可能在转发前后执行一些额外的动作(例如画二个边框)。透明性使得你可以递归地嵌套多个装饰,从而可以添加任意多的功能。 装饰对象结构模式的意图就是动态地给一个对象添加一些额外的职责。就增加功能来说,该模式相比生成子类更为灵活。其示意类图如图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) ); }

考点:计算机软件水平考试中级软件设计师中级软件设计师下午试题
题型:问答题

I sometimes stay at home on Sundays, But ________ I go to the parks.       [ ]

A. mostly    

B. most      

C. hardly    

D. ever

题型:问答题

下列航空属于我国主要国际航空港的是[ ]

A、武汉

B、南京

C、广州

D、拉萨

题型:问答题

《电力建设工程预算定额》是按正常的气候、地理、环境条件下施工考虑的,未包括()等特殊条件下的施工。

A、冬季

B、雨季

C、实际施工组织

D、操作方法

题型:问答题

某镇10万人口,2001年全死因死亡1000例。该年结核病患者总数为200人,其中男120人,女80人;结核病死亡40人,其中24例为男性。

根据上述资料,该镇2001年结核病的患病率为()

A.2‰

B.60‰

C.10‰

D.50‰

E.20%

题型:问答题

根据被管理者的成就需要、权力需要和合群需要对其进行管理,其出发点是将被管理者视为( )。

A.经济人
B.社会人
C.决策人
D.文化人

更多题库