Decorator(装饰、油漆工)--对象结构型模式
#ifndef DECORATOR_H_
#define DECORATOR_H_
#include "iostream"
using namespace std;
/* 接口的一致性:装饰对象的接口必须和他所装饰的Component的接口
是一致的。因此,所有的ConcreteDecorator类必须有一个公共的接口
*/
// 抽象基类定义一个对象接口,可为这个接口动态的添加职责
class Component
{
public:
Component() {}
virtual ~Component() {}
// 纯虚函数
virtual void operation() = 0;
};
// 抽象基类,维护一个指向Componetn的指针
class Decorator : public Component
{
public:
Decorator(Component* pnt):cpnt_(pnt) {}
virtual ~Decorator()
{
delete cpnt_;
cpnt_ = 0;
}
protected:
Component* cpnt_; // Component的指针
};
// 需要被动态添加职责的类
class ConcreateComponent: public Component
{
public:
ConcreateComponent() {}
virtual ~ConcreateComponent() {}
virtual void operation()
{
cout<<"operation of concreate component!"<<endl;
}
};
// 派生在Decorator,为ConcreateComponent动态添加职责的类
class ConcreateDecorator : public Decorator
{
public:
ConcreateDecorator(Component* pont):Decorator(pont) {}
virtual ~ ConcreateDecorator() {}
// 动态添加职责在此处实现
virtual void operation()
{
// 把请求转发给component对象,并在转发前后执行额外的操作。
cpnt_->operation();
add_behavior();
}
private:
void add_behavior()
{
cout<<"add behavior!"<<endl;
}
};
#endif
#include "Decorator.h"
int main()
{
// 初始化一个Component对象
Component* pt = new ConcreateComponent;
// 用Component对象去初始化一个Decorator对象,
// 这样就可以为这个Component对象动态添加职责了
// 当想对对象进行动态添加不同的职责的时候,只需要
// 生成不同的Decorator的子类对象,把被装饰的对象组件
// 放到这个子类对象中即可。可以连续把被装饰的对象放进一个或者
// 多个Decorator的子类中去完成不同的装饰
Decorator* dr = new ConcreateDecorator(pt);
// 调用Decorator的接口进行添加职责
dr->operation();
delete dr;
}