1 适用性
\• 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加一些职责,如:加密层,解密层。
• 处理那些可能偶尔才会用到的特性接口
• 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持
每一种组合将产生大量的子类,使得子类数目呈爆炸性增长
#include "stdafx.h"
#include <iostream>
using namespace std;
class Component //被装饰者抽象类
{
public:
virtual void Draw() = 0;
};
class Decorator : public Component //被装饰者基类
{
public:
Decorator(Component *c) : _component(c){}
~Decorator() {delete _component;}
virtual void Draw() { if (_component) _component->Draw();}
private:
Component *_component;
};
//////////////////////////////////////////////////////////////////////////
class MyComponent : public Component //被装饰者
{
public:
virtual void Draw() {cout << "MyComponent::Draw()" << endl;}
};
//////////////////////////////////////////////////////////////////////////
class BorderDecorator : public Decorator //边框装饰
{
public:
BorderDecorator(Component *c) : Decorator(c){}
virtual void Draw()
{
cout << "DrawBorder" << endl;
Decorator::Draw();
}
};
class ScrollDecorator : public Decorator //滚动条装饰
{
public:
ScrollDecorator(Component *c) : Decorator(c){}
virtual void Draw()
{
cout << "DrawSrollbar" << endl;
Decorator::Draw();
}
};
int main()
{
Component *c2 = new BorderDecorator(
new MyComponent()); //装饰边框的组件
c2->Draw();
delete c2;
Component *c3 = new ScrollDecorator(
new BorderDecorator(
new MyComponent())); //同时装饰上边框和滚动条的组件
c2->Draw();
delete c3;
system("pause");
return 0;
}
posted on 2009-01-16 15:58
黑色天使 阅读(368)
评论(0) 编辑 收藏 引用 所属分类:
设计模式