C++装饰者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shineboyxxb/article/details/52144732

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。装饰者模式主要包括了被装饰者对象和装饰者对象,这两个对象是同类对象(都属于抽象装饰类的子类),装饰者对象中有被装饰者的引用或指针,这样装饰者就能在被装饰者的行为之前或之后加上自己的行为从而达到扩展被装饰者对象的目的。具体类模型图如下:

 

代码实现如下:

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//抽象组件
class Beverage
{
public:
	virtual string GetDescription()
	{
		return description;
	}
	virtual double cost()=0;
	string description;
};
//抽象的装饰类
class CondimentDecorator: public Beverage
{
	virtual string GetDescription()=0;
};
//实际被装饰的组件需要继承抽象组件
class Espresso: public Beverage
{
public:
	Espresso()
	{
		description="Espresso";
	}
	double cost()
	{
		return 1.99;
	}
};
//实际被装饰的组件
class DarkRoast :public Beverage
{
public:
	DarkRoast()
	{
		description="DarkRoast";
	}
	double cost()
	{
		return 0.99;
	}
};
//装饰者需要继承抽象装饰类
class Mocha:public CondimentDecorator
{
public:
	Mocha(Beverage* beverage)
	{
		this->myBeverage=beverage;
	}
	virtual string GetDescription()
	{
		return myBeverage->GetDescription()+" ,Mocha";
	}
	double cost()
	{
		return 0.20+myBeverage->cost();
	}
private:
	Beverage *myBeverage;

};
//装饰者
class Whip:public CondimentDecorator
{
public:
	Whip(Beverage* beverage)
	{
		this->myBeverage=beverage;
	}
	virtual string GetDescription()
	{
		return myBeverage->GetDescription()+" ,Whip";
	}
	double cost()
	{
		return 0.10+myBeverage->cost();
	}
private:
	Beverage *myBeverage;

};

int _tmain(int argc, _TCHAR* argv[])
{
	//定义一个未被装饰的组件
	Beverage *beverage=new Espresso();
	cout<<beverage->GetDescription()<<" $"<<beverage->cost()<<endl;
	//定义一个未被装饰的组件
	Beverage *beverage2=new DarkRoast();
	//用装饰者Mocha装饰beverage2
	Beverage *beverage3=new Mocha(beverage2);
	//用装饰者Mocha装饰beverage2
	Beverage *beverage4=new Mocha(beverage3);
	//用装饰者Whip装饰beverage2
	Beverage *beverage5=new Whip(beverage4);
	//装饰后的结果
	cout<<beverage5->GetDescription()<<" $"<<beverage5->cost()<<endl;
	delete beverage;
	delete beverage2;
	delete beverage3;
	delete beverage4;
	delete beverage5;
	return 0;
}
程序运行结果如下:



猜你喜欢

转载自blog.csdn.net/shineboyxxb/article/details/52144732