c++实现装饰器模式

来源:互联网 发布:加油好男儿现状 知乎 编辑:程序博客网 时间:2024/06/08 04:38

一、定义

装饰器模式(DecoratorPattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。

 

使用情况:如果需要添加新功能,但又不想修改定义好的接口或者抽象类,此时适合用装饰模式。

 

应用场景举例:例如对于一个蛋糕Cake类,一开始是一个原始蛋糕模型,后面需要给蛋糕加工—加上奶油,加上巧克力,加上瓜子仁,加上水果,写上字等。等同于将原始蛋糕作为一个Cake类,我们给这个Cake类的对象作修饰,为了不破坏开放-封闭原则,也为了更好的拓展,我们不能直接在Cake这个类里修改,而应该做一个装饰器给这个蛋糕做装饰。

 

优点:

1、可以不用修改原有的接口,就可以实现新功能的添加

2、装饰者可以很方便的转换原有接口中的实现,可以给装饰者指定不同的ConcreteComponent实现不同的功能。

缺点:

1、复杂性增加,装饰者模式会导致许多小类的产生。

 

二、实现(参考网上代码)

component.h 这个文件描述原始对象和需要被装饰的对象

#ifndefCOMPONENT_H_#defineCOMPONENT_H_ #include<iostream> //定义一个原始的抽象类蛋糕,装饰器的功能是给蛋糕加上各种装饰,如奶油,巧克力,瓜子仁,水果等class Cake {public:    virtual void showCake()=0;    //表示该函数没有函数体,函数体在派生类里定义     virtual ~Cake() {};    std::string name;}; classConcreteCake : public Cake {public:    ConcreteCake() {        name = "原始蛋糕";    }     void showCake() { std::cout <<name.c_str() << std::endl; };     virtual ~ConcreteCake() {};}; #endif
 

decorator.h文件描述具体的装饰器的类

#include"component.h" classCakeDecrator : public Cake {protected:    Cake *pCake;   //维护一个Cake对象的引用,为Cake对象添加装饰public:    virtual void showCake() = 0;     virtual ~CakeDecrator() {};}; classCakeDecratorMilk : public CakeDecrator {public:    CakeDecratorMilk(Cake *pCake) {        this->pCake = pCake;    }     void showCake() {        this->name = pCake->name + "加奶油";        std::cout << name.c_str()<< std::endl;    }     virtual ~CakeDecratorMilk() {};}; classCakeDecratorChoclate: public CakeDecrator{public:    CakeDecratorChoclate(Cake* pCake){        this->pCake = pCake;    }    void showCake(){        this->name = pCake->name + "加巧克力";       std::cout<<name.c_str()<<std::endl;    };    virtual ~CakeDecratorChoclate(){};};
 

main.cpp代码

#include"decorator.h" int main(){    ConcreteCake *pConCake = newConcreteCake();    pConCake->showCake();     CakeDecratorMilk* pDecMilk = newCakeDecratorMilk(pConCake);    pDecMilk->showCake();    CakeDecratorChoclate *pDecCho = newCakeDecratorChoclate(pDecMilk);    pDecCho->showCake();     delete pConCake;    delete pDecMilk;    delete pDecCho;    return 0;}

输出:

 

三、总结

装饰器模式与建造者模式的区别:建造者模式必须按照统一的步骤来构建某个对象,而装饰器模式不需要,例如上面的例子,你可以选择先涂奶油再涂巧克力。建造者模式按照统一步骤先造人的头、身体、手最后是脚,而装饰器模式是为这个已经建造好的人的对象添加内裤、上衣、帽子等。

 

 

 

原创粉丝点击