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函数.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值