class CDress
{
public:
	virtual	~CDress()	{}
	virtual	void	Show()
	{
		printf("dressed boy.\n");
	}
};2、装饰类基类class CFinery : public CDress
{
public:
	CFinery() : m_poDress(NULL)	{}
	virtual	~CFinery()	{}
	virtual	void	Show()
	{
		if (m_poDress)
		{
			m_poDress->Show();
		}
	}
	
	void	Decorate(CDress* poCDress)
	{
		m_poDress = poCDress;
	}
private:
	CDress*	m_poDress;
};3、T恤和牛仔裤的具体装饰类class CTShirt : public	CFinery
{
public:
	virtual	~CTShirt()	{}
	void	Show()
	{
		printf("Tshirt ");
		CFinery::Show();
	}
};
class CJeans : public	CFinery
{
public:
	virtual	~CJeans()	{}
	
	void	Show()
	{
		printf("Jeans ");
		CFinery::Show();
	}
};
这里需注意,装饰类对象的Show()函数在显示出本对象的装扮的同时,需要去调用装饰基类的Show()函数,以显示其被装饰对象的旧有装扮,即不能忘了老朋友。
4、装饰过程int main(int argc, char* argv[])
{
	CDress	oCDress;
	CTShirt	oCTShirt;
	CJeans	oCJeans;
	oCTShirt.Decorate(&oCDress);
	oCJeans.Decorate(&oCTShirt);
	oCJeans.Show();
	
	return 0;
}通过装饰过程可以看出,oCJeans 对象装饰了 oCTShirt 对象,所以 oCJeans 调用 Show() 函数时会调用 oCTShirt 的 Show() 函数,oCTShirt 又装饰了 oCDress 对象,这时 oCTShirt 又会调用 oCDress 的 Show() 函数,有点类似递归,也有点类似链表的味道,当然我们知道递归需要有一个终结者的,不然就没完没了了,所以最后被装饰的对象 oCDress 是不在有任何装饰对象的。
同时,如果小菜的妹子不喜欢这套打扮风格了,说要小菜把T恤换成衬衫,这时我们只要新增一个衬衫装饰类 CShirt ,然后把 oCJeans 的装饰对象换成 CShirt 即可,这里可见,使用了装饰模式后,换衣服都方便灵活多了。
5、装饰模式的应用版权声明:本文为博主原创文章,如需转载请说明转至http://blog.csdn.net/gufeng99
原文:http://blog.csdn.net/gufeng99/article/details/46753771