C++装饰器模式(Decorator)

UML类图(仅供参考)如下:

装饰器模式解决的问题:

给一个对象动态的增加功能,使用装饰器模式

源码

#include <iostream>
#include <string>

// 手机抽象类
class CPhone
{
public:
	virtual ~CPhone() {}
	virtual void ShowDecorator() = 0;
};

// 装饰器抽象类,必须继承手机类
class CDecorator :public CPhone
{
public:
	CDecorator(CPhone *phone) :m_phone(phone) {}
	virtual ~CDecorator() {}
	virtual void ShowDecorator()
	{
		m_phone->ShowDecorator();
	}
private:
	CPhone *m_phone;
};

// 苹果手机
class CiPhone :public CPhone
{
public:
	CiPhone(std::string &sName) :m_sName(sName) {}
	~CiPhone() {}

	// 需要增加这个方法的功能
	virtual void ShowDecorator()
	{
		std::cout << m_sName << "手机的装饰器" << std::endl;
	}

private:
	std::string m_sName;
};

// 安卓手机
class CAndroidPhone :public CPhone
{
public:
	CAndroidPhone(std::string &sName) :m_sName(sName) {}
	~CAndroidPhone() {}

	// 需要增加这个方法的功能
	virtual void ShowDecorator()
	{
		std::cout << m_sName << "手机的装饰器" << std::endl;
	}

private:
	std::string m_sName;
};

// 挂件装饰器类
class CPendantDecorator :public CDecorator
{
public:
	CPendantDecorator(CPhone *phone) :CDecorator(phone) {}
	virtual void ShowDecorator()
	{ 
		// 这里是原先的功能
		CDecorator::ShowDecorator();

		// 新添加的功能
		AddDecorate();
	}

private:
	void AddDecorate() 
	{
		std::cout << "增加挂件" << std::endl;
	}
};

// 贴膜装饰器类
class CFilmDecorator :public CDecorator
{
public:
	CFilmDecorator(CPhone *phone) :CDecorator(phone) {}
	virtual void ShowDecorator()
	{
		// 这里是原先的功能
		CDecorator::ShowDecorator();

		// 新添加的功能
		AddDecorate();
	}

private:
	void AddDecorate()
	{
		std::cout << "增加贴膜" << std::endl;
	}
};

// 测试
int main()
{
	// 给苹果手机增加挂件和贴膜
	std::string sName = "苹果";
	CPhone *Phone1 = new CiPhone(sName);
	CPhone *Phone2 = new CPendantDecorator(Phone1);
	CPhone *Phone3 = new CFilmDecorator(Phone2);
	Phone3->ShowDecorator();

	std::cout << std::endl;

	// 给安卓手机增加挂件和贴膜
	std::string _sName = "安卓";
	CPhone *_Phone1 = new CiPhone(_sName);
	CPhone *_Phone2 = new CPendantDecorator(_Phone1);
	CPhone *_Phone3 = new CFilmDecorator(_Phone2);
	_Phone3->ShowDecorator();

	return 0;
}

好处

可以动态的给类增加新的功能,且不会影响其他功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值