动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更灵活。装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。
职责:动态的为一个对象增加新的功能
#include <iostream>
#include <string>
using namespace std;
//公共抽象类
class Phone
{
public:
Phone(){}
virtual ~Phone(){}
virtual void ShowDecorate(){}
};
//具体的手机类
class iPhone :public Phone
{
public:
iPhone(string name) :m_name(name){}
~iPhone(){}
void ShowDecorate()
{
cout << m_name << "的装饰" << endl;
}
private:
string m_name;
};
//具体的手机类
class NokiaPhone :public Phone
{
public:
NokiaPhone(string name) :m_name(name){}
~NokiaPhone(){}
void ShowDecorate()
{
cout << m_name << "的装饰" << endl;
}
private:
string m_name;
};
//装饰类
class DecoratorPhone :public Phone
{
public:
DecoratorPhone(Phone *phone) :m_phone(phone){}
~DecoratorPhone(){ delete m_phone; }
virtual void ShowDecorate(){ m_phone->ShowDecorate(); }
private:
Phone *m_phone; //要装饰的手机
};
//具体的装饰类
class DecoratorPhoneA :public DecoratorPhone
{
public:
DecoratorPhoneA(Phone *phone) :DecoratorPhone(phone){}
void ShowDecorate(){ DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
void AddDecorate(){ cout << "挂件功能" << endl; }
};
//具体的装饰类
class DecoratorPhoneB :public DecoratorPhone
{
public:
DecoratorPhoneB(Phone *phone) :DecoratorPhone(phone){}
void ShowDecorate(){ DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
void AddDecorate(){ cout << "屏幕贴膜" << endl; }
};
int main()
{
Phone *iphone = new iPhone("6300");
Phone *dpa = new DecoratorPhoneA(iphone);
Phone *dpb = new DecoratorPhoneB(dpa);
dpb->ShowDecorate();
system("Pause");
return 0;
}
#include <iostream>
#include<string>
using namespace std;
//定义一个原始的抽象蛋糕
class Cake
{
public:
virtual void showCake() = 0;
virtual ~Cake(){}
public:
string name;
};
//构建原始蛋糕
class ConcreteCake :public Cake
{
public:
ConcreteCake()
{
name = "原始蛋糕";
}
void showCake(){ cout << name << endl; }
virtual ~ConcreteCake(){}
};
//定义装饰器类,装饰器类继承被装饰类,抽象类作为接口
class CakeDecrator :public Cake
{
public:
virtual void showCake() = 0;
virtual ~CakeDecrator(){}
protected:
Cake *pCake;
};
//定义具体的修饰器
class CakeDecratorMile :public CakeDecrator
{
public:
CakeDecratorMile(Cake *pCake)
{
this->pCake = pCake;
}
void showCake()
{
this->name = pCake->name + "加奶油";
cout << this->name << endl;
}
virtual ~CakeDecratorMile(){};
};
//定义具体修饰器
class CakeDecratorCholate :public CakeDecrator
{
public:
CakeDecratorCholate(Cake *pCake)
{
this->pCake = pCake;
}
void showCake()
{
this->name = pCake->name + "加巧克力";
cout << this->name << endl;
}
virtual ~CakeDecratorCholate(){};
};
int main()
{
ConcreteCake *pConCake = new ConcreteCake();
pConCake->showCake();
CakeDecratorMile *pDecMile = new CakeDecratorMile(pConCake);
pDecMile->showCake();
CakeDecratorCholate *pDecCho = new CakeDecratorCholate(pDecMile);
pDecCho->showCake();
delete pConCake;
delete pDecMile;
delete pDecCho;
system("Pause");
return 0;
}