设计模式之装饰者模式

Posted sofard

tags:

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

本文章需要的基础知识:继承,多态,工厂模式。

场景:可以任意加配料的咖啡,能输出咖啡名和价格。

原理:叠加,组合。

所有的咖啡都能输出咖啡名和价格,那么名字和价格设为虚函数应该没问题。即我们要有个抽象基类包含名字,价格这2个函数,那不就是water么!!

water 

{

 virtual PrintDescription();

    virtual GetValue();

}

白咖啡,黑咖啡,红咖啡 区别是什么?描述不一样,价格不一样,因此咖啡就形成了工厂模式了。

RedCoffe:water

{

  string  description;

       int     value;

    PrintDescription();

    GetValue();

}

WhiteCoffe:water

{

  string  description;

       int     value;

    PrintDescription();

    GetValue();

}

.........

现在要加配料?我们需要实现糖,盐,牛奶等等配料(这又是工厂模式吧)

看一个向一杯白咖啡先加糖,再加盐,再加牛奶的情形。

加糖的时候往哪里加? 往白咖啡里面加。

加盐的时候往哪里加?往带糖的白咖啡里面加。

加牛奶的时候往哪里加?往带糖,盐的白咖啡里面加。

说明配料构造的时候需要目标  ---> 构造函数需要参数,具体参数是什么呢 ?? 这个例子里面是白咖啡,假如目标是黑咖啡呢  ? 所以参数必须设为各种咖啡的老爸,也就是water了。

配料构造成功后 还能能作为(目标)传递下去,说明 构造成功后 还是 water --> 配料继承于water类。。

 

现在矛盾了啊,咖啡 和 盐,糖,牛奶(等配料) 怎么成了一个东西??

唉,我前面不是一直在说配料构造需要目标,配料继承与water么,我可以定义一个配料类啊

于是

Ingredient : water

{

  water *aim;

  Ingredient(water * p) : aim(p)

  {

  };

}

然后盐,糖,牛奶就是以ingredient为基类的工厂模式。

总结:

 

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

戏说模式之装饰者模式(游戏)

Java设计模式之装饰者模式

iOS设计模式之装饰者模式

设计模式之装饰者模式

设计模式之装饰者模式C++实现

设计模式之装饰者模式C++实现