您的位置:首页 > 编程语言 > C语言/C++

c++实现装饰器模式

2017-07-30 15:37 288 查看
一、定义

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

输出:



 

三、总结

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

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: