设计模式之---装饰(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
)
);

原创粉丝点击