设计模式学习_装饰者模式

Posted Leslie X徐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式学习_装饰者模式相关的知识,希望对你有一定的参考价值。

装饰者模式

概述

装饰者模式动态地将责任附加到对象身上.
若要扩展功能,装饰者提供了比继承更富有弹性的替代方案.

装饰者和被装饰者拥有相同的超类
可以使用一个或多个装饰者包装一个对象
装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定目的
对象可以在任何时候被装饰,可以在运行时动态地不限量地装饰.

项目

顾客想要一个摩卡和奶泡深焙咖啡
步骤

  • 拿一个深焙咖啡对象
  • 以摩卡对象装饰它
  • 以奶泡对象装饰它
  • 调用cost()方法,并依赖委托将调料的价钱加上去.

在这里插入图片描述

代码

饮料抽象类:

class Beverage{
	protected:
	string description = "unknown Beverage";
	public:
	virtual string getDescription(){
		return description;
	}
	
	virtual double cost() = 0;
};

饮料实例

class Espresso:
	public Beverage
{
	public:
	Espresso(){
		description =  "Espresso";
	}
	double cost(){
		return 1.99;
	}
};

class HouseBlend:
	public Beverage
{
	public:
	HouseBlend(){
		description =  "House Blend Coffee";
	}
	double cost(){
		return 0.89;
	}
};

调料装饰抽象类


class CondimentDecorator:
	public Beverage
{
	public:
		virtual string getDescription()=0;
};

调料实例

class Mocha:
	public CondimentDecorator
{
	Beverage *beverage;
	
	public:
	Mocha(Beverage *beverage){
		this->beverage = beverage;
	}
	
	string getDescription(){
		return beverage->getDescription() + ", Mocha";
	}
	
	double cost(){
		return 0.2 + beverage->cost();
	}
};

class Whip:
	public CondimentDecorator
{
	Beverage *beverage;
	
	public:
	Whip(Beverage *beverage){
		this->beverage = beverage;
	}
	
	string getDescription(){
		return beverage->getDescription() + ", Whip";
	}
	
	double cost(){
		return 0.1 + beverage->cost();
	}
};

主函数测试

int main(int argc, char **argv)
{
	Beverage *beverage = new Espresso();
	cout<<beverage->getDescription()<<" $ "<<beverage->cost()<<endl;
	
	Beverage *beverage2 = new HouseBlend();
	beverage2 = new Mocha(beverage2);
	beverage2 = new Mocha(beverage2);
	beverage2 = new Whip(beverage2);
	cout<<beverage2->getDescription()<<" $ "<<beverage2->cost()<<endl;
	
	return 0;
}

输出

Espresso $ 1.99
House Blend Coffee, Mocha, Mocha, Whip $ 1.39

以上是关于设计模式学习_装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式06_装饰者模式

装饰者模式——HeadFirst 设计模式学习笔记

设计模式之装饰者模式

装饰者模式

小白学习设计模式之装饰者模式

设计模式学习总结--装饰者模式