zoukankan      html  css  js  c++  java
  • 设计模式之装饰者模式

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

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

    原理:叠加,组合。

    所有的咖啡都能输出咖啡名和价格,那么名字和价格设为虚函数应该没问题。即我们要有个抽象基类包含名字,价格这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为基类的工厂模式。

    总结:

  • 相关阅读:
    使用UIImagePickerController时3DTouch引起的Crash问题的解决--备用
    阿帕奇证书配置
    终端编写c程序
    native2ascii 在 Mac终端的转码
    mac 下 配置 阿帕奇
    苹果电脑的坑
    iOS证书快要过期怎么办?
    An unspecified error occurred!
    一个苹果证书怎么多次使用
    多媒体开发之---live555的多线程支持,原本只是单线程,单通道
  • 原文地址:https://www.cnblogs.com/sofard/p/9757730.html
Copyright © 2011-2022 走看看