C++装饰者模式

简介

时常会遇到这样一种情况,我已经设计好了一个接口,并且也有几个实现类,但是这时我发现我设计的时候疏忽了,忘记了一些功能,或者后来需求变动要求加入一些功能,最简单的做法就是修改接口,添加函数,然后继承类中都相应的添加实现,这样做倒也没什么问题,但是如果这种变化来个好几次或者继承类非常多,那工作量可就大了。

这时大神们就发明了装饰者模式,在不修改现在有接口和实现类的基础上实现功能或者状态的添加。

UML

在这里插入图片描述

优点

1.可以不用修改原有的接口,就可以实现新功能的添加。

2.装饰者可以很方便的转换原有接口中的实现,可以给装饰者指定不同的ConcreteComponent实现不同的功能。

缺点

1.复杂性增加,装饰者模式会导致许多小类的产生。

代码

#include <iostream>

using namespace std;

enum GIFT {
    GLOW_STICK,
    ROCKETS
};

// 只播平台用户接口
class IUser
{
public:
    virtual void comeIn() = 0;
    virtual void sendGifts(GIFT gift) = 0;
};

// 普通观众
class Customer : public IUser
{
public:
    void IUser();
    void comeIn() {
        cout << "***到了直播间" << endl;
    }
    void sendGifts(GIFT gift) {
        switch (gift) {
        case GLOW_STICK: {
            cout << "感谢宝宝们的荧光棒" << endl;
        }
            break;
        case ROCKETS: {
            cout << "榜一大哥快点击下方小方块加主播微信" << endl;
        }
            break;
        default:
            break;
        }

    }
};

// 装饰者接口
class IDecorator : public IUser
{
public:
    // 旧接口
    virtual void comeIn() = 0; // 需要改变
    virtual void sendGifts(GIFT gift) = 0; // 保持原来功能
    // 新添加功能
    virtual void getAnchorWeiXin() = 0;
    // 设置装饰对象
    virtual void setComponent(IUser *user) = 0;
};

// 榜一大哥实现类
class BigBorther : public IDecorator
{
public:
    void comeIn() {
        cout << "大哥开着航母来到了直播间" << endl;
    }

    void sendGifts(GIFT gift) {
        m_pUser->sendGifts(gift);
    }

    void getAnchorWeiXin() {
        cout << "xiaoerduo111" << endl;
    }

    void setComponent(IUser *pUser){
        m_pUser = pUser;
    }
private:
    IUser *m_pUser;
};

int main()
{

    IUser *poorMe = new  Customer();
    poorMe->comeIn();
    poorMe->sendGifts(GLOW_STICK);

    BigBorther *richMe = new BigBorther();
    richMe->setComponent(poorMe);
    richMe->comeIn();
    richMe->sendGifts(ROCKETS);
    richMe->getAnchorWeiXin();

    return 0;
}


理解

主要给一个类动态增加功能,或修改原有接口,比如产品非让你给他的需求加个自作主张的小功能,而你觉得这个功能客户肯定不要,但是你还得加,这时候可以使用装扮者模式,不改变原来的类接口定义,可以增加或修改接口。等到客户否定了产品之后,我们直接删掉所加的功能就好了。体现了开闭原则!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值