GreensnoWorld
记录点滴,分享乐趣,一块凝固的时间
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;
}

 

LIJG
余本顽劣,生于紫云下,长于汝水滨。早年求学,兴趣广泛,好高骛远,学无所成,仓皇入世。兴趣所致,投身互联网,求知未证,而立已至,始悟光阴荏苒,终需务实钻研。故有此站,记录时光,积累点滴,验证所学,分享愚见。指舞方寸间,心系万千年。
留言