简介
时常会遇到这样一种情况,我已经设计好了一个接口,并且也有几个实现类,但是这时我发现我设计的时候疏忽了,忘记了一些功能,或者后来需求变动要求加入一些功能,最简单的做法就是修改接口,添加函数,然后继承类中都相应的添加实现,这样做倒也没什么问题,但是如果这种变化来个好几次或者继承类非常多,那工作量可就大了。
这时大神们就发明了装饰者模式,在不修改现在有接口和实现类的基础上实现功能或者状态的添加。
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;
}
理解
主要给一个类动态增加功能,或修改原有接口,比如产品非让你给他的需求加个自作主张的小功能,而你觉得这个功能客户肯定不要,但是你还得加,这时候可以使用装扮者模式,不改变原来的类接口定义,可以增加或修改接口。等到客户否定了产品之后,我们直接删掉所加的功能就好了。体现了开闭原则!