• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

1.目的

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

2.结构

fbs54qj0hcx3987.png

3.参与者

组件:定义一个对象接口,它可以动态地给这些对象添加职责。

ConcreteComponent:定义一个对象,您可以向其添加一些责任。

Decorator:维护一个指向组件对象的指针,并定义一个总是连接到组件接口的接口。

ConcreteDecorator:向组件添加职责。

4.适应性

装饰模式用于以下情况:

以动态和透明的方式向单个对象添加责任,而不影响其他对象;

办理那些可以撤销的职务;

当你不能通过生成子类来扩展它的时候。在一种情况下,可能有大量独立的扩展。为了支持每一个组合,都会产生大量的子类,导致子类数量爆炸式增长。另一种情况是因为类定义被隐藏,或者类定义不能用来生成子类;

5.代码示例

类visualComponent

{

公共:

visual component();

虚拟void Draw();

虚拟void Resize();

};

//定义VisualComponent的子类Decorator。我们将生成Decorator的子类来获得不同的装饰。

类装饰器:公共visualComponent

{

公共:

decorator(visual component *);

虚拟void Draw();

虚拟void Resize();

//.

private:

visualComponent * _ component

};

//Decorator修饰_component实例变量引用的VisualComponent,该变量在构造函数中初始化。

//对于VisualComponent接口中定义的每个操作,Decorator类定义了一个默认实现,它将请求转发到_ component3360

void Decorator:Draw()

{

_ component-Draw();

}

void Decorator:Resize()

{

_ component-Resize();

}

decorator的子类定义了特殊的装饰函数。例如,BorderDecorator类向它包含的组件添加边框。

//BorderDecorator是decorator or的子类,它重新定义了绘制边框的绘制操作。同时,BorderDecorator还定义了

//一个私有的辅助操作DrawBorder,绘制边框。这些子类继承了Decorator类的所有其他操作。

类BorderDecorator :公共装饰器

{

公共:

border decorator(visual component *,int border width);

虚拟void Draw();

private:

void draw border(int);

private:

int _ width

};

void border decorator : draw()

{

decorator : draw();

draw border(_ width);

}

//类似的可以实现ScrollDecorator和DropShadowDecorator,为可视化组件增加滚动和阴影功能。

//将可视组件放入窗口对象中

空窗口:内容(VisualComponent*内容)

{

//.

}

//现在我们可以创建一个文本视图,将窗口:放在这个文本视图中。

Window* window=新窗口;

Textview * textview=new Textview

//TextView是一个VisualComponent,可以放在窗口3360中

window-set contents(textview);

//但是我们想要一个有边界的可以滚动的TextView,所以我们在把它放入窗口3360之前先修饰一下

window-set contents(new border decorator(new scroll decorator(textview),1);

6.摘要

装饰模式用于动态地给对象增加一些额外的责任,而不是子类的生成。decorator模式的目的是解决subject类向多个方向扩展的问题。

装饰模式可以比继承更灵活地扩展其功能。通过安排和组合不同的特定装饰类别,可以创建不同行为的许多组合。

使用装饰模式比使用继承需要更少的类。然而,使用装饰模式会比使用继承产生更多的对象。

在Decorator模式中,Decorator类对组件类是透明的,Decorator用于扩展组件类的功能。装饰器必须与组件的接口保持一致,组件是用户的统一接口。

ConcreteComponent和decorative Decorator都继承自Component。为了保证接口的一致性,组件的实现应该尽可能简单。

Link to comment
Share on other sites