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;
}
输出:
三、总结
装饰器模式与建造者模式的区别:建造者模式必须按照统一的步骤来构建某个对象,而装饰器模式不需要,例如上面的例子,你可以选择先涂奶油再涂巧克力。建造者模式按照统一步骤先造人的头、身体、手最后是脚,而装饰器模式是为这个已经建造好的人的对象添加内裤、上衣、帽子等。
装饰器模式(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;
}
输出:
三、总结
装饰器模式与建造者模式的区别:建造者模式必须按照统一的步骤来构建某个对象,而装饰器模式不需要,例如上面的例子,你可以选择先涂奶油再涂巧克力。建造者模式按照统一步骤先造人的头、身体、手最后是脚,而装饰器模式是为这个已经建造好的人的对象添加内裤、上衣、帽子等。
相关文章推荐
- c++实现装饰器模式
- 设计模式C++实现(11)——装饰模式
- 设计模式c++实现(一):装饰(Decorator)模式
- 装饰模式c++代码实现
- 设计模式之装饰模式(C++实现)
- 设计模式C++实现(11)——装饰模式
- 设计模式之装饰模式 c++实现和详细分析
- 设计模式C++实现(11)——装饰模式
- 设计模式C++实现(11)——装饰模式
- 设计模式C++实现(11)——装饰模式
- 设计模式C++实现(11)——装饰模式
- 设计模式 -- 装饰模式 -- c++实现
- 23种设计模式之装饰器模式(结构型,2 Decorator,c++实现)
- 设计模式C++实现--装饰模式
- 设计模式C++实现(11)——装饰模式
- 设计模式C++实现(11)——装饰模式
- 设计模式----装饰模式(C++实现)
- 设计模式C++实现(11)——装饰模式
- 设计模式--装饰模式C++实现
- 结构型模式之装饰模式(Decorator Pattern)C++实现