设计模式学习系列9 外观模式Facade
1.概述
自己卖了一辆越野自行车,但毕竟不是自己定制的,买回来之后可能需要更改一下脚蹬,座皮,里程计数器或者刹车系统,假如将自行车看做一个整体系统,对我们而言使用的是自行车,然后我们对自己车构件的修改对于我们的使用而言并没有什么影响。在软件里面一个大型系统需要分割为多个不同的子系统组成,可能回派分给不同的人去完成,对于我们整个系统顶层实现而言,我们只用关注子系统提供的接口即可,而不用去处理子系统的细节,并且尽量去降低每个子系统之间的关系对于后面的扩展肯定是更好的。从面向对象的角度而言,我们需要每个子系统之间的耦合行最低并且子系统的更改尽量不会去更改顶层代码,这时候我们就需要外观模式来完成这个人物。
2.外观模式定义
外观模式定义为子系统中的一组接口提供一个一致的界面, 这个接口使得这一子系统更加容易使用。引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。
(1)适用情况
- 构件一个层次的系统时,子系统接口通过外观模式定义
- 为复杂系统提供一个简单的接口,满足子系统变化对顶层结构无影响
- 客户端与抽象类之间依赖性太强
(2)优缺点
优点:
- 减少客户端与子系统之间的耦合度,减少客户端处理的数目,子系统的变化不会影响到客户端的代码。
- 降低模块之间的编译依赖性
缺点:
- 只能处理单一的子系统,如果引入新的子系统,则需要修改整个客户端代码。
3.C++实现
//外观模式
#include "iostream"
using namespace std;
class SubSystem1
{
public:
void Action()
{
cout << "子系统1" << endl;
}
};
class SubSystem2
{
public:
void Action()
{
cout << "子系统2" << endl;
}
};
class Facede
{
private:
SubSystem1* pSubSystem1 ;
SubSystem2* pSubSystem2 ;
public:
Facede():pSubSystem1(0),pSubSystem2(0)
{
pSubSystem1 = new SubSystem1 ;
pSubSystem2 = new SubSystem2 ;
}
~Facede()
{
if(pSubSystem1 != 0)
delete pSubSystem1 ;
if(pSubSystem2 != 0)
delete pSubSystem2 ;
}
void Action()
{
cout << "系统执行" << endl;
pSubSystem1->Action();
pSubSystem2->Action();
}
};
int main()
{
Facede* pFacede = new Facede ;
pFacede->Action();
delete pFacede;
return 1;
}
4.扩展:抽象外观模式
外观模式中需要对子系统进行删除,增加,修改的时候就需要对外观接口以及里面的子类进行修改,遮掩归咎违背了面向对象的“开放闭合原则”,抽象外观模式可以避免这个问题的问题。 抽象外观模式增减一个抽象外观的基类,当对当前的子系统进行修改时可通过新的外观模式类来实现新的接口。
图中增加了新的SubsystemC子类,这个时候不用去修改原有接口,只用重新增加一个新的接口接口。
5参考
http://blog.csdn.net/hguisu/article/details/7533759
http://blog.csdn.net/lovelion/article/details/8259789