#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
{
private:
Component *m_pComponent;
public:
Decorator(Component *p)
{
m_pComponent = p;
}
void Operation()
{
m_pComponent->Operation();
}
};
class ConcreteDecoratorA : public Decorator
{
public:
ConcreteDecoratorA(Component *p) :Decorator(p)
{
}
void AddedBehavior()
{
cout << "This is added behavior A." << endl;
}
void Operation()
{
AddedBehavior();
Decorator::Operation();
}
};
class ConcreteDecoratorB : public Decorator
{
public:
ConcreteDecoratorB(Component *p) :Decorator(p)
{
}
void AddedBehavior()
{
cout << "This is added behavior B." << endl;
}
void Operation()
{
AddedBehavior();
Decorator::Operation();
}
};
int main()
{
Component *pComponent = new ConcreteComponent();
Decorator *pDecA = new ConcreteDecoratorA(pComponent);
pDecA->Operation();
Decorator *pDecB = new ConcreteDecoratorB(pComponent);
pDecB->Operation();
Decorator *pDecAB = new ConcreteDecoratorB(pDecA);
pDecAB->Operation();
delete pDecAB;
pDecAB = NULL;
delete pDecB;
pDecB = NULL;
delete pDecA;
pDecA = NULL;
delete pComponent;
pComponent = NULL;
return 0;
}