一、概念
从外部给类添加新职能,而不用去修改原始的类(满足面向对象的开放-封闭原则),扩展性好,可复用程度高。
二、原理
- Component 为一个抽象对象,装饰器和具体需要被装饰的对象都继承自该抽象对象,最重要的一点是Decrator维护了一个需要被装饰的对象的引用,从而达到为该对象添加职能的目的。
- demo:为一个蛋糕添加装饰 。蛋糕店刚生产出来的蛋糕是最原始的,只是一个蛋糕原型,我们需要再这个蛋糕上加上奶油,加上巧克力,加上瓜子仁,写上字等,将原始蛋糕作为一个Cake类,我们给这个Cake类的对象作装饰,为了不破坏开放-封闭原则,也为了更好的拓展,我们不能直接在Cake这个类里修改,而应该通过装饰器来给这个蛋糕做装饰。
三、代码实现
1.component.h
component.h 这个文件描述原始对象和需要被装饰的对象
cpp
#ifndef DECRATOR_COMPONENT_H
#define DECRATOR_COMPONENT_H
using namespace std;
//定义一个原始的抽象类蛋糕,装饰器的功能是给蛋糕加上各种装饰,如奶油,巧克力,瓜子仁,花生米等
class Cake{
public:
Cake(){};
~Cake(){};
virtual void showCake() = 0;//纯虚函数
string m_sName;
};
class ConcreteCake:public Cake{
public:
ConcreteCake(){
m_sName = "原始蛋糕";
}
~ConcreteCake(){}
virtual void showCake()
{
cout << m_sName << endl;
}
};
#endif //DECRATOR_COMPONENT_H
2.decorator.h
decorator.h文件描述具体的装饰器的类
cpp
#ifndef DECRATOR_DECORATOR_H
#define DECRATOR_DECORATOR_H
#include "component.h"
class CakeDecorator:public Cake{
public:
CakeDecorator(){}
~CakeDecorator(){}
virtual void showCake() = 0;
protected:
Cake *m_pCake;//需要被装饰的对象,为Cake对象添加装饰
};
class CakeDecoratorMilk:public CakeDecorator{
public:
CakeDecoratorMilk(Cake *pCake)
{
m_pCake = pCake;
}
~CakeDecoratorMilk(){
}
virtual void showCake() {
m_sName = m_pCake->m_sName + "加奶油";
cout << m_sName << endl;
}
};
class CakeDecoratorCholate:public CakeDecorator{
public:
CakeDecoratorCholate(Cake *pCake){
m_pCake = pCake;
}
~CakeDecoratorCholate(){}
virtual void showCake(){
m_sName = m_pCake->m_sName + "加巧克力";
cout << m_sName << endl;
}
};
#endif //DECRATOR_DECORATOR_H
3.main.cpp
cpp
#include <iostream>
#include "component.h"
#include "decorator.h"
int main() {
std::cout << "decorator Mode!" << std::endl;
ConcreteCake *pConcrete = new ConcreteCake();
pConcrete->showCake();
CakeDecoratorMilk *pDecMilk = new CakeDecoratorMilk(pConcrete);
pDecMilk->showCake();
CakeDecoratorCholate *pDecCholate = new CakeDecoratorCholate(pConcrete);
pDecCholate->showCake();
delete pConcrete;
delete pDecMilk;
delete pDecCholate;
return 0;
}
三、运行结果
