UML类图(仅供参考)如下:
装饰器模式解决的问题:
给一个对象动态的增加功能,使用装饰器模式
源码
#include <iostream>
#include <string>
// 手机抽象类
class CPhone
{
public:
virtual ~CPhone() {}
virtual void ShowDecorator() = 0;
};
// 装饰器抽象类,必须继承手机类
class CDecorator :public CPhone
{
public:
CDecorator(CPhone *phone) :m_phone(phone) {}
virtual ~CDecorator() {}
virtual void ShowDecorator()
{
m_phone->ShowDecorator();
}
private:
CPhone *m_phone;
};
// 苹果手机
class CiPhone :public CPhone
{
public:
CiPhone(std::string &sName) :m_sName(sName) {}
~CiPhone() {}
// 需要增加这个方法的功能
virtual void ShowDecorator()
{
std::cout << m_sName << "手机的装饰器" << std::endl;
}
private:
std::string m_sName;
};
// 安卓手机
class CAndroidPhone :public CPhone
{
public:
CAndroidPhone(std::string &sName) :m_sName(sName) {}
~CAndroidPhone() {}
// 需要增加这个方法的功能
virtual void ShowDecorator()
{
std::cout << m_sName << "手机的装饰器" << std::endl;
}
private:
std::string m_sName;
};
// 挂件装饰器类
class CPendantDecorator :public CDecorator
{
public:
CPendantDecorator(CPhone *phone) :CDecorator(phone) {}
virtual void ShowDecorator()
{
// 这里是原先的功能
CDecorator::ShowDecorator();
// 新添加的功能
AddDecorate();
}
private:
void AddDecorate()
{
std::cout << "增加挂件" << std::endl;
}
};
// 贴膜装饰器类
class CFilmDecorator :public CDecorator
{
public:
CFilmDecorator(CPhone *phone) :CDecorator(phone) {}
virtual void ShowDecorator()
{
// 这里是原先的功能
CDecorator::ShowDecorator();
// 新添加的功能
AddDecorate();
}
private:
void AddDecorate()
{
std::cout << "增加贴膜" << std::endl;
}
};
// 测试
int main()
{
// 给苹果手机增加挂件和贴膜
std::string sName = "苹果";
CPhone *Phone1 = new CiPhone(sName);
CPhone *Phone2 = new CPendantDecorator(Phone1);
CPhone *Phone3 = new CFilmDecorator(Phone2);
Phone3->ShowDecorator();
std::cout << std::endl;
// 给安卓手机增加挂件和贴膜
std::string _sName = "安卓";
CPhone *_Phone1 = new CiPhone(_sName);
CPhone *_Phone2 = new CPendantDecorator(_Phone1);
CPhone *_Phone3 = new CFilmDecorator(_Phone2);
_Phone3->ShowDecorator();
return 0;
}
好处
可以动态的给类增加新的功能,且不会影响其他功能