简述
装饰器是为已经有的功能动态地添加更多功能的一种方式,当一个类需要新功能时,首先想到的是在旧的类中修改源代码,增加新的功能来装饰原来的核心功能。如果功能需求变化,就必须再次修改源码,不符合开闭原则。增加了类复杂性。
场景
有一个Programmer类,他有两个成员函数 Work(), OffDuty(),想要给这两个成员函数添加新功能。并且这两个函数内部实现极复杂,所以直接修改这个类的代码是下下策,这时候装饰器模式就可以很好的实现了
UML类图
对象职责
Programmer:被装饰的对象
DecoratorProgrammer:装饰器,给Programmer添加功能
代码实现
#include <stdio.h>
#include <iostream>
class Programmer
{
public:
Programmer() {};
~Programmer() {};
virtual void Work()
{
std::cout << "程序员 上班时间:写程序" << std::endl;
}
virtual void OffDuty()
{
std::cout << "程序员 上班时间:学习新技术" << std::endl;
}
private:
};
class DecoratorProgrammer : public Programmer
{
public:
DecoratorProgrammer(Programmer *programmer)
{
mProgrammer = programmer;
}
~DecoratorProgrammer() {}
void setProgrammer(Programmer *programmer)
{
mProgrammer = programmer;
}
virtual void Work()
{
if (mProgrammer == NULL)
{
return;
}
mProgrammer->Work();
std::cout << "新加功能: 修电脑" << std::endl;
}
virtual void OffDuty()
{
if (mProgrammer == NULL)
{
return;
}
mProgrammer->OffDuty();
std::cout << "新加功能: 写博文" << std::endl;
}
private:
Programmer* mProgrammer;
};
void main(void)
{
Programmer *p = new Programmer;
p->Work();
p->OffDuty();
//添加装饰器
Programmer *d1 = new DecoratorProgrammer(p);
printf("\n-------------装饰后-------------\n");
d1->Work();
d1->OffDuty();
while (1);
return;
}