装饰者模式

请先理解为什么要引入装饰者模式?

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


我们以饮料为主体,然后在运行时以调料来装饰饮料。


注意:

1.装饰者和被装饰者有相同的超类型。

2.可以用一个或多个装饰者包装一个对象。

3.在任何需要原始对象(被包装)的场合,可以用装饰过的对象代替它。

4.装饰者可以在所委托被装饰者的行为之前与(或)之后,加上自己的行为,已达到特定的目的。

5.对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

装饰者模式_第1张图片

注意这句话:
每个包装者都有一个(包装一个)组件,也就是说,装饰者有一个实例变量以保存某个Component的引用。

下面来看饮料对应的类图:

装饰者模式_第2张图片

注意:

将装饰者与组件组合时,就是在加入新的行为。所得到的新行为,并不是继承自超类,而是有组合对象得来的。

Beverage和CondimentDecorator都是抽象类。

下面是调料(装饰者)的代码:

class Mocha :public CondimentDecorator{
private:
	Beverage beverage;                  //用一个实例变量记录饮料,也就是被装饰者
public:
	Mocha(Beverage beverage)            //把饮料当做构造器的参数
	{
		this.beverage = beverage;
	}
	string getDescription()
	{
		return beverage.getDescription() + ", Mocha";  //这就是“委托”达到继承效果
	}
	double cost()
	{
		return 0.20 + beverage.cost();  //首先把调用委托给被装饰对象,然后再加上Mocha的价钱
	}
};


你可能感兴趣的:(装饰者模式)