zoukankan      html  css  js  c++  java
  • 装饰者模式Decorator – 学习HeadFirst设计模式记录

     

    装饰者模式:

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

     

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

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

     

         OO原则:多用组合,少用继承。

      

    1、装饰者和被装饰者共同的基类

    /*Beverage饮料*/
    class Beverage 
    {
    public:
        Beverage()
        {
            _description = "Unknow Beverage";
        }

        virtual std::string GetDescription()
        {
            return _description;
        }
        virtual double Cost() = 0;
        
    protected:
        std::string _description;
    };

    2、被装饰者类

    /*Espresso浓咖啡*/
    class Espresso : public Beverage
    {
    public:
        Espresso()
        {
            _description = "Espresso Coffee";
        }

        virtual double Cost()
        {
            return 1.99;
        }
    };

    /*HouseBlend综合咖啡,星巴克独家调配咖啡*/
    class HouseBlend : public Beverage
    {
    public:
        HouseBlend()
        {
            _description = "House Blend Coffee";
        }
        
        virtual double Cost()
        {
            return 1.99;
        }
    };

     

    3、装饰者类

      
    /*Condiment调味品*/
    class CondimentDecorator : public Beverage
    {
    public:
        CondimentDecorator()
        {
            _description = "Condiment Decorator";
        }
        
        virtual double Cost() = 0;
    };

    /*Mocha调味品摩卡*/
    class Mocha : public CondimentDecorator
    {
    public:
        Mocha(Beverage *beverage)
        {
            _beverage = beverage;
            _description = beverage->GetDescription();
            _description += " + Mocha";
        }

        virtual double Cost()
        {
            return 0.2 + _beverage->Cost();
        }

    private:
        Beverage *_beverage;
    };

    /*Whip调味品奶泡*/
    class Whip : public CondimentDecorator
    {
    public:
        Whip(Beverage *beverage)
        {
            _beverage = beverage;
            _description = beverage->GetDescription();
            _description += " + Whip";
        }
        
        virtual double Cost()
        {
            return 0.2 + _beverage->Cost();
        }
        
    private:
        Beverage *_beverage;
    };
    /*Soy调味品豆浆*/
    class Soy : public CondimentDecorator
    {
    public:
      Soy(Beverage *beverage)
        {
      _beverage = beverage;
      _description = beverage->GetDescription();
      _description += " + Sop";
      }
      virtual double Cost()
      {
      return 0.2 + _beverage->Cost();
      }
    private:
      Beverage *_beverage;
    };

     4、测试代码

    int main()
    {
        std::cout<<"Decorator patten."<<std::endl<<std::endl; 

        Beverage *beverage = new Espresso();  /*未添加装饰*/
        std::cout<<beverage->GetDescription().c_str()<<" , $"<<beverage->Cost()<<std::endl;

        Beverage *beverage2 = new HouseBlend();
        beverage2 = new Mocha(beverage2);  /*添加装饰*/
        beverage2 = new Mocha(beverage2);  /*添加装饰*/
        beverage2 = new Whip(beverage2);   /*添加装饰*/
        beverage2 = new Soy(beverage2);    /*添加装饰*/

        std::cout<<beverage2->GetDescription().c_str()<<" , $"<<beverage2->Cost()<<std::endl;

        return 0;
    }

  • 相关阅读:
    CSS3旋转动画
    CSS3的动画属性
    CSS选择器
    JS事件委托
    js 轮播图效果
    JS事件冒泡和事件捕获
    JS自定义播放器
    js闭包for循环只执行最后一个值得解决方法
    交通红绿灯
    汉明距
  • 原文地址:https://www.cnblogs.com/ant-wjf/p/4554468.html
Copyright © 2011-2022 走看看