设计模式C++版:第五式装饰者模式

装饰模式,就是动态地为已有功能添加更多功能的一种方式把每个要装饰的功能放在单独的类中,让他包装它所有装饰的对象。所以需要执行特殊行为时,客户代码就可以在运行时根据需要有选择、按顺序的使用装饰功能包装对象。这也是和建造者模式不同的地方。

装饰者模式的优势是:可以简化核心类,把核心职责和装饰功能区分开。下面是简单示例:

#include <iostream>
#include <string>
class Person
{
public:
	Person(){ }

	Person(const std::string &name)
	{
		this->m_name = name;
	}

	//核心功能
	virtual void show()
	{
		std::cout << "装扮的" << m_name << std::endl;
	}
private:
	std::string m_name;
};


class Finery :public Person
{
protected:
	Person *m_person;
public:
	void Decorate(Person *componert)
	{
		this->m_person = componert;
	}

	void show() override
	{
		if (m_person !=nullptr)
		{
			m_person->show();
		}
	}
};


class TShirts : public Finery
{
public:
	void show()override
	{
		//装饰功能
		std::cout << "T恤";
		Finery::show();        /*核心功能*/
	}
};

class TBigTrouser : public Finery
{
public:
	void show()override
	{
		//装饰功能
		std::cout << "肥裤子";
		Finery::show();
	}
};

int main()
{
	Person *person = new Person("小菜");

	TBigTrouser *bt = new TBigTrouser;

	TShirts *ts = new TShirts;

	bt->Decorate(person);

	ts->Decorate(bt);    
	
	ts->show();
	/*先调用自身的show,再调用父类,涉及多态,接着实际调用bt的show,再接着调用下一层的show----*/
	delete person;
	delete bt;
	delete ts;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值