c++实现装饰器模式

一、定义

装饰器模式(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;
}

输出:

 

三、总结

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

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值