设计模式之---装饰(decorator)
来源:互联网 发布:mac mpp文件 编辑:程序博客网 时间:2024/05/20 17:41
设计模式之---装饰(decorator)
1.意图:动态的给一个对象添加一些额外的职责。
notice: 是给对象,而不是类。
2.别名:包容器(wrapper)
3.动机:
1)有时我们需要给某个对象而不是整个类添加一些功能。
2)使用继承机制是添加功能的一种有效途径。但不够灵活。一种较为灵活的方式是将组建潜入到另一个对象中。称这个潜入的对象为装饰(decorator),这个装饰与它所装饰的组建接口一致。
4.适用性:
1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2)处理那些可以撤消的职责。
3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
5.参与者
*component
--定义一个对象接口,可以给这些对象动态的添加职责。
*concretecomponent
--定义一个对象,可以给这个队像添加一些职责。
*decorator
--维持一个指向component对象的指针,并定一个与component 接口一致的接口。
*concreteDecorator
--向组件(ConcreteComponent)添加职责。
6.协作:
Decorator将请求转发给他的Component对象,并在转发请求前后执行一些附加的动作。
7.实现:
接口一致:Component和ConcreteDecorator类接口是一致的。
8.结构:
9.代码示例:
/***********************************************************************
与模式中的对应关系:
component--VisualComponent
ConcreteComponent--TextView
Decorator--Decorator
ConcreteDecorator--BorderDecorator&ScrollDecorator
*对TextView的一个实例textView进行装饰。
*Decorator和TextView有相同接口,Draw();
*window有成员函数SetContents(VisualComponent * contents)
{
contents->Draw();
}
**************************************************************************/
class VisualComponent;
class Window {
public:
void SetContents (VisualComponent* contents);
};
/*
*/
class VisualComponent {
public:
VisualComponent();
virtual void Draw();
virtual void Resize();
// ...
};
/*
*/
class Decorator : public VisualComponent {
public:
Decorator(VisualComponent*);
/*
*/
virtual void Draw();
virtual void Resize();
// ...
private:
VisualComponent* _component;
};
/*
*/
void Decorator::Draw () {
_component->Draw();
}
void Decorator::Resize () {
_component->Resize();
}
/*
*/
class BorderDecorator : public Decorator {
public:
BorderDecorator(VisualComponent*, int borderWidth);
virtual void Draw();
private:
void DrawBorder(int);
private:
int _width;
};
/*
*/
void BorderDecorator::Draw () {
Decorator::Draw();
DrawBorder(_width);
}
/*
*/
void Window::SetContents (VisualComponent* contents) {
// ...
}
/*
*/
class ScrollDecorator : public Decorator {
public:
ScrollDecorator(VisualComponent*);
};
class TextView : public VisualComponent {
};
main () {
/*
*/
Window* window = new Window;
TextView* textView = new TextView;
/*
*/
window->SetContents(textView);
/*
*/
window->SetContents(
new BorderDecorator(
new ScrollDecorator(textView), 1
)
);
- 【设计模式】之装饰模式(Decorator)
- 设计模式之装饰模式(Decorator)
- 设计模式之 装饰模式(Decorator)
- 设计模式之装饰模式(Decorator)
- 设计模式之装饰(Decorator)模式
- 设计模式之装饰模式(Decorator)
- 设计模式之装饰模式(Decorator)
- 设计模式之---装饰(decorator)
- 设计模式之Decorator(装饰者)
- 设计模式(九)之Decorator - 装饰模式
- 23种设计模式之装饰模式(Decorator)
- 设计模式笔记之装饰者模式(Decorator Pattern)
- 设计模式之——装饰者模式(Decorator)
- 设计模式C++之十三(Decorator装饰模式)
- java.io.*中的设计模式之 装饰(Decorator)模式
- 设计模式之装饰者模式(Decorator)
- C#设计模式之装饰者模式(Decorator Pattern)
- java23种常用设计模式之装饰模式(Decorator)
- [转载]X264和XVID压缩电影视频比较
- .NET环境下几种不同的邮件发送解决方案
- .Net开发人员必备工具
- BT的使用方法!
- PHP网站中整体防注入方法
- 设计模式之---装饰(decorator)
- 你好 请问在Delphi中 怎样用NMUDP 传输文件
- Eclipse快速上手Hibernate--2. 利用Hbm映射文件开发
- Using the Axis TCP Monitor (tcpmon)
- 用jfreechart来生成统计图表
- 用java编写简单UDP网络通信程序
- 浩荡离愁白日斜,吟鞭东指即天涯。落红不是无情物,化作春泥更护花。
- 【转载】学不可以已——我一年Java之路的回顾,反思以及展望(上)
- axis + spring 集成(2)