意图:动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
结构:
Component —定义一个对象接口,可以给需要装饰的对象动态的添加职责。
ConcreteComponent —定义一个对象,并对该对象进行装饰(或者添加一些职责)。
Decorator — 维持一个指向Component 的指针,并定义一个与Component 接口一致的接口。
ConcreteDecorator — 添加职责。
Decorator 将请求发送给Component 对象,然后由 Component 指针指向的对象执行相应的操作。
代码:
#include<iostream>
using namespace std;
class Component
{
public:
virtual void Operation() = 0;
};
class ConcreteComponent : public Component
{
public:
virtual void Operation()
{
cout << "I am no decoratored ConcreteComponent" << endl;
}
};
class Decorator : public Component
{
public:
Decorator(Component *pComponent) : m_pComponentObj(pComponent) {}
virtual void Operation()
{
if (m_pComponentObj != NULL)
{
m_pComponentObj->Operation();
}
}
protected:
Component *m_pComponentObj;
};
class ConcreteDecoratorA : public Decorator
{
public:
ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
virtual void Operation()
{
Decorator::Operation();
AddedBehavior();
}
void AddedBehavior()
{
cout << "This is added behavior A." << endl;
}
};
class ConcreteDecoratorB : public Decorator
{
public:
ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
virtual void Operation()
{
Decorator::Operation();
AddedBehavior();
}
void AddedBehavior()
{
cout << "This is added behavior B." << endl;
}
};
int main()
{
Component *pComponentObj = new ConcreteComponent();
Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
Decorator *pDecoratorB1jb = new ConcreteDecoratorB(pDecoratorAOjb);
pDecoratorB1jb->Operation();
cout << "=============================================" << endl;
Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
pDecoratorBOjb->Operation();
cout << "=============================================" << endl;
Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
pDecoratorBAOjb->Operation();
cout << "=============================================" << endl;
delete pDecoratorBAOjb;
pDecoratorBAOjb = NULL;
delete pDecoratorBOjb;
pDecoratorBOjb = NULL;
delete pDecoratorB1jb;
pDecoratorB1jb = NULL;
delete pDecoratorAOjb;
pDecoratorAOjb = NULL;
delete pComponentObj;
pComponentObj = NULL;
getchar();
}