现在的位置: 首页 > 综合 > 正文

设计模式c++实现(一):装饰(Decorator)模式

2019年01月07日 ⁄ 综合 ⁄ 共 1685字 ⁄ 字号 评论关闭

转载请注明,来自:http://blog.csdn.net/skyman_2001

class Component
{
public:
	Component() {}
	virtual ~Component() {}

	virtual void operation() = 0;
	virtual Component *remove() = 0;
};

class ConcreteComponent: public Component
{
public:
	ConcreteComponent() {}
	~ConcreteComponent() {}

	void operation()
	{
		std::cout <<"Concrete component operation"<< std::endl;
	}

	Component *remove()
	{
		return this;
	}
};
class Decorator : public Component
{
public:
	Decorator(Component *comp) : m_component(comp) {}
	virtual ~Decorator() {}
		 
	virtual void operation()
	{
		m_component->operation();
	}

	Component *remove()
	{
		return m_component;
	}
		 
private:
	Component *m_component;
};

class Decor1: public Decorator
{
public:
	Decor1(Component *comp) : Decorator(comp){}
	virtual ~Decor1() {}

	virtual void operation()
	{
		Decorator::operation();
		addedBehavior();
	}

private:	
	void addedBehavior()
	{
		std::cout << "Decor1 addedBehavior" << std::endl;
	}
};

class Decor2: public Decorator
{
public:
	Decor2(Component *comp) : Decorator(comp) {}
	virtual ~Decor2() {}

	virtual void operation()
	{
		Decorator::operation();
		addedBehavior();
	}

private:	
	void addedBehavior()
	{
		std::cout << "Decor2 addedBehavior" << std::endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Component* concrete = new ConcreteComponent();
	Component* decored1 = new Decor1(concrete);
	Component* decored2 = new Decor2(decored1);
	decored2->operation();

	cout << "---------------" << endl;

	Component* temp = decored2->remove();
	temp->operation();

	cout << "---------------" << endl;

	temp = temp->remove();
	temp->operation();

	cout << "---------------" << endl;

	temp = temp->remove();
	temp->operation();

	delete decored2;
	delete decored1;
	delete concrete;

	return 0;
}

运行结果:

Concrete component operation
Decor1 addedBehavior
Decor2 addedBehavior
---------------
Concrete component operation
Decor1 addedBehavior
---------------
Concrete component operation
---------------
Concrete component operation

抱歉!评论已关闭.