C++设计模式之装饰模式
什么是装饰模式
**装饰模式:**动态的给一个对象添加一些额外的职责,就添加功能来说,装饰模式比生成子类更为灵活。
有的时候,我们希望给某个类添加一些功能。比如手机,允许你为手机添加特性,比如增加挂件,贴膜等,而不是手机这个类需要这些功能。
一种灵活的设计模式,将手机嵌入到另一个对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰和它所装饰的组件接口一致,因此它对使用该组件的客户透明。
首先定义个Phone的基类
struct Phone
{
public:
Phone() {}
virtual ~Phone() {}
virtual void ShowDecorate() {}
};
可以生成一个子类IPhone
struct iPhone : public Phone
{
private:
string m_name; //手机名称
public:
iPhone(string name): m_name(name){}
~iPhone() {}
void ShowDecorate() { cout<<m_name<<“的装饰”<<endl;}
};
为Phone生成DecoratorPhone类, 将手机嵌入到另一个对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。
//装饰类
struct DecoratorPhone : public Phone
{
private:
Phone *m_phone; //要装饰的手机
public:
DecoratorPhone(Phone *phone): m_phone(phone) {}
virtual void ShowDecorate() { m_phone->ShowDecorate(); }
};
具体的装饰类DecoratorPhoneA,这个装饰和它所装饰的组件接口一致,因此它对使用该组件的客户透明。
struct DecoratorPhoneB : public DecoratorPhone
{
public:
DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {}
void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
void AddDecorate() { cout<<“屏幕贴膜”<<endl; } //增加的装饰
};
struct DecoratorPhoneB : public DecoratorPhone
{
public:
DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {}
void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
private:
void AddDecorate() { cout<<“屏幕贴膜”<<endl; } //增加的装饰
};
主函数
int main()
{
Phone *phone = new IPhone(“6300”);
Phone *dpa = new DecoratorPhoneA(phone); //装饰,增加挂件
Phone *dpb = new DecoratorPhoneB(dpa); //装饰,屏幕贴膜
dpb->ShowDecorate();
delete dpa;
delete dpb;
return 0;
}
输出
6300的装饰
增加挂件
屏幕贴膜
首先我们用Phone指针指向IPhone的对象,然后用着个Phone指针初始化一个DecoratorPhoneA对象,并用Phone指针dpa指向它,然后用着个指针dpa初始化一个DecoratorPhoneB对象,并用Phone指针dpb指向它,dpb调用DecoratorPhoneB ::ShowDecorate函数.