2008.装饰模式
设计模式 2023年7月31日
#include <iostream>
using namespace std;
class Component
{
public:
virtual void Operation() = 0;
};
class ConcreteComponent: public Component
{
public:
void Operation()
{
cout << "I am no decoratored ConcreteComponent" << endl;
}
};
class Decorator: public Component
{
public:
Decorator(Component *pComponent): m_pComponentObj(pComponent){}
void Operation()
{
if(m_pComponentObj != NULL)
{
m_pComponentObj->Operation();
}
}
protected:
Component *m_pComponentObj;
};
class ConcreteDecoratorA: public Decorator
{
public:
ConcreteDecoratorA(Component *pDecorator): Decorator(pDecorator){}
void Operation()
{
AddedBehavior();
Decorator::Operation();
}
void AddedBehavior()
{
cout << "This is added behavior A." << endl;
}
};
class ConcreteDecoratorB: public Decorator
{
public:
ConcreteDecoratorB(Component *pDecorator): Decorator(pDecorator){}
void Operation()
{
AddedBehavior();
Decorator::Operation();
}
void AddedBehavior()
{
cout << "This is added behavior B." << endl;
}
};
int main()
{
Component *pComponentObj = new ConcreteComponent();
Decorator *pDecoratorAObj = new ConcreteDecoratorA(pComponentObj);
pDecoratorAObj->Operation();
cout << "==========" << endl;
Decorator *pDecoratorBObj = new ConcreteDecoratorB(pComponentObj);
pDecoratorBObj->Operation();
cout << "==========" << endl;
Decorator *pDecoratorBAObj = new ConcreteDecoratorB(pDecoratorAObj);
pDecoratorBAObj->Operation();
cout << "==========" << endl;
delete pDecoratorBAObj;
pDecoratorBAObj = NULL;
delete pDecoratorBObj;
pDecoratorBObj = NULL;
delete pDecoratorAObj;
pDecoratorAObj = NULL;
delete pComponentObj;
pComponentObj = NULL;
}