C++设计模式--装饰者模式解析(head first 设计模式C++实现)

装饰者模式

  1. 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承者更有弹性的替代方案。 装饰者模式通常配合工厂模式使用
  2. 运行时扩展远比编译时期的继承更好,利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然后,如果呢个够利用组合的做法扩展对象的行为,就可以在运行时动态进行扩展。
  3. 装饰者和被装饰者有相同的顶层父类,需要变化的部分在父类中隔离出来,装饰者和被装饰者进行不同的实现。
  4. 装饰者模式,可以用一个或多个装饰者嵌套包装一个对象(被装饰者) 装饰者下例中是饮料中加的东西,被装饰的对象是饮料。装饰者可以动态扩展。
  5. 装饰者模式就是增加一系列行为到被包装对象上,每一个行为/对象相当于一个装饰
  6. 装饰者模式体现是设计原则:
    • 开放-关闭原则:类应该对扩展开放,对修改关闭 (遵循开放-关闭原则,通常会引入新的抽象层次,增加代码的复杂度。应用于代码中最可能改变的地方。)

例子

在这里插入图片描述
在这里插入图片描述


 class Bevarage{
    public:
        Bevarage(){}
        ~Bevarage(){}
        virtual double cost()=0;
        virtual string getDescription()=0;

        int getsize(){
            return size;
        }
    protected:
        string description="Unknown Beverage";
        int size=10;

};  

class Espresso:public Bevarage{
    public:
        Espresso(){
            description="This is Espresso";
        }
        virtual string getDescription(){
            return description;
        };
        virtual double cost(){
            return 1.99;
        }

};

class HouseBlend:public Bevarage{
    public:
        HouseBlend(){
            description="This is HouseBlend";
        }
        virtual string getDescription(){
            return description;
        };
        virtual double cost(){
            return 0.89;
        }

};

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

class Mocha : public CondimentDecorator{
    private:
        Bevarage* bevarage;
    public:
        Mocha(Bevarage* m_bevarage):bevarage(m_bevarage){}

        virtual string getDescription(){
            return bevarage->getDescription()+","+"Mocha"; 
        }

        double cost(){
            return bevarage->cost()+1;
        }

};
 
class Whip: public CondimentDecorator{
    private:
        Bevarage* bevarage;
    public:
        Whip(Bevarage* m_bevarage):bevarage(m_bevarage){}

        virtual string getDescription(){
            return bevarage->getDescription()+","+"Whip";
             
        }

        double cost(){
            return bevarage->cost()+2;
        }

};


int main(){
    //Espresso1.99 HouseBlend0.89  Mocha1 Whip2
    Espresso* espresso = new Espresso;

    Whip* _whip=new Whip(espresso);
    _whip=new Whip(_whip);

    cout<<_whip->getDescription()<<" costs="<<_whip->cost();
    
     


    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值