简介
时常会遇到这样一种情况,我已经设计好了一个接口,并且也有几个实现类,但是这时我发现我设计的时候疏忽了,忘记了一些功能,或者后来需求变动要求加入一些功能,最简单的做法就是修改接口,添加函数,然后继承类中都相应的添加实现,这样做倒也没什么问题,但是如果这种变化来个好几次或者继承类非常多,那工作量可就大了。
这时大神们就发明了装饰者模式,在不修改现在有接口和实现类的基础上实现功能或者状态的添加。
UML
优点
1.可以不用修改原有的接口,就可以实现新功能的添加。
2.装饰者可以很方便的转换原有接口中的实现,可以给装饰者指定不同的ConcreteComponent实现不同的功能。
缺点
1.复杂性增加,装饰者模式会导致许多小类的产生。
代码
#include <iostream>
using namespace std;
class IUser
{
public:
virtual void comeIn() = 0;
};
class Customer : public IUser
{
public:
void IUser();
void comeIn() {
cout << "a big brother come in" << endl;
}
};
class IDecorator : public IUser
{
public:
virtual void comeIn() = 0;
virtual void getNetworkAnchorWX() = 0;
virtual void setComponent(IUser *user) = 0;
};
class VIP : public IDecorator
{
public:
void comeIn() {
m_pUser->comeIn();
}
void getNetworkAnchorWX() {
cout << "xiaoerduo111" << endl;
}
void setComponent(IUser *pUser){
this->m_pUser = pUser;
}
private:
IUser *m_pUser;
};
int main()
{
IUser *poorMe = new Customer();
poorMe->comeIn();
VIP *richMe = new VIP();
richMe->setComponent(poorMe);
richMe->getNetworkAnchorWX();
return 0;
}
理解
主要给一个类动态增加功能,比如产品非让你给他的需求加个自作主张的小功能,而你觉得这个功能客户肯定不要,但是你还得加,这时候可以使用装扮者模式,不改变原来的类。加入新的功能。等到客户否定了产品之后,我们直接删掉所加的功能就好了。体现了开闭原则!
|