(转)设计模式--装饰器模式

本文深入探讨了装饰模式在软件设计中的应用,通过实例展示了如何动态地为对象添加职责,比较了装饰模式与子类生成的灵活性差异。提供了装饰模式在手机和蛋糕类中实现的具体代码示例,帮助读者理解其工作原理。

动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更灵活。装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。

职责:动态的为一个对象增加新的功能

#include <iostream>
#include <string>

using namespace std;

//公共抽象类
class Phone
{
public:
	Phone(){}
	virtual ~Phone(){}
	virtual void ShowDecorate(){}
};
//具体的手机类
class iPhone :public Phone
{
public:
	iPhone(string name) :m_name(name){}
	~iPhone(){}
	void ShowDecorate()
	{
		cout << m_name << "的装饰" << endl;
	}
private:
	string m_name;
};
//具体的手机类
class NokiaPhone :public Phone
{
public:
	NokiaPhone(string name) :m_name(name){}
	~NokiaPhone(){}
	void ShowDecorate()
	{
		cout << m_name << "的装饰" << endl;
	}
private:
	string m_name;
};
//装饰类
class DecoratorPhone :public Phone
{
public:
	DecoratorPhone(Phone *phone) :m_phone(phone){}
	~DecoratorPhone(){ delete m_phone; }
	virtual void ShowDecorate(){ m_phone->ShowDecorate(); }
private:
	Phone *m_phone;		//要装饰的手机
};
//具体的装饰类
class DecoratorPhoneA :public DecoratorPhone
{
public:
	DecoratorPhoneA(Phone *phone) :DecoratorPhone(phone){}
	void ShowDecorate(){ DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
	void AddDecorate(){ cout << "挂件功能" << endl; }
};
//具体的装饰类
class DecoratorPhoneB :public DecoratorPhone
{
public:
	DecoratorPhoneB(Phone *phone) :DecoratorPhone(phone){}
	void ShowDecorate(){ DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
	void AddDecorate(){ cout << "屏幕贴膜" << endl; }
};

int main()
{
	Phone *iphone = new iPhone("6300");
	Phone *dpa = new DecoratorPhoneA(iphone);
	Phone *dpb = new DecoratorPhoneB(dpa);
	dpb->ShowDecorate();
	system("Pause");
	return 0;
}
#include <iostream>
#include<string>

using namespace std;
//定义一个原始的抽象蛋糕
class Cake
{
public:
	virtual void showCake() = 0;
	virtual ~Cake(){}
public:
	string name;
};
//构建原始蛋糕
class ConcreteCake :public Cake
{
public:
	ConcreteCake()
	{
		name = "原始蛋糕";
	}
	void showCake(){ cout << name << endl; }
	virtual ~ConcreteCake(){}
};
//定义装饰器类,装饰器类继承被装饰类,抽象类作为接口
class CakeDecrator :public Cake
{
public:
	virtual void showCake() = 0;
	virtual ~CakeDecrator(){}
protected:
	Cake *pCake;
};
//定义具体的修饰器
class CakeDecratorMile :public CakeDecrator
{
public:
	CakeDecratorMile(Cake *pCake)
	{
		this->pCake = pCake;
	}
	void showCake()
	{
		this->name = pCake->name + "加奶油";
		cout << this->name << endl;
	}
	virtual ~CakeDecratorMile(){};
};
//定义具体修饰器
class CakeDecratorCholate :public CakeDecrator
{
public:
	CakeDecratorCholate(Cake *pCake)
	{
		this->pCake = pCake;
	}
	void showCake()
	{
		this->name = pCake->name + "加巧克力";
		cout << this->name << endl;
	}
	virtual ~CakeDecratorCholate(){};
};

int main()
{
	ConcreteCake *pConCake = new ConcreteCake();
	pConCake->showCake();

	CakeDecratorMile *pDecMile = new CakeDecratorMile(pConCake);
	pDecMile->showCake();
	CakeDecratorCholate *pDecCho = new CakeDecratorCholate(pDecMile);
	pDecCho->showCake();

	delete pConCake;
	delete pDecMile;
	delete pDecCho;

	system("Pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值