介绍
- Facade外观模式(有的也叫门面)
- 定义:Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的
简单的界面被称作facade。 - 客户端可以调用这个角色的方法。 此角色知晓子系统的所有功能和责任。 一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去, 也就说该角色没有实际的业务逻辑, 只是一个委托类。
- subsystem子系统角色
可以同时有一个或者多个子系统。 每一个子系统都不是一个单独的类, 而是一个类的集合。 子系统并不知道门面的存在。 对于子系统而言, 门面仅仅是另外一个客户端而已。
优点: 减少系统的相互依赖; 提高了灵活性;提高了安全性。它完美地体现了依赖倒转原则和迪米特法则的思想。
缺点: 不符合开闭原则
应用: 为一个复杂的模块或子系统提供一个供外界访问的接口;让子系统更加容易使用。子系统相对独立——外界对子系统的访问只要黑箱操作即可; 预防低水平人员带来的风险扩散。
UML类图:
简单示例:
#ifndef SIMPLE_FACADE_H
#define SIMPLE_FACADE_H
#include <iostream>
using namespace std;
class SubSystemOne
{
public:
void methodOne()
{
cout<<"子系统方法 一"<<endl;
}
};
class SubSystemTwo
{
public:
void methodTwo()
{
cout<<"子系统方法 二"<<endl;
}
};
class SubSystemThree
{
public:
void methodThree()
{
cout<<"子系统方法 三"<<endl;
}
};
class SubSystemFour
{
public:
void methodFour()
{
cout<<"子系统方法 四"<<endl;
}
};
class Facade
{
public:
Facade()
{
mSubOne = new SubSystemOne;
mSubTwo = new SubSystemTwo;
mSubThree = new SubSystemThree;
mSubFour = new SubSystemFour;
}
void methodA()
{
cout<<"\n方法组A\n";
mSubOne->methodOne();
mSubThree->methodThree();
mSubFour->methodFour();
}
void methodB()
{
cout<<"\n方法组B\n";
mSubTwo->methodTwo();
mSubThree->methodThree();
}
private:
SubSystemOne *mSubOne;
SubSystemTwo *mSubTwo;
SubSystemThree *mSubThree;
SubSystemFour *mSubFour;
};
#endif // SIMPLE_FACADE_H
调用方法:
#include "simple_facade.h"
int main()
{
Facade facade;
facade.methodA();
facade.methodB();
return 0;
}
再来一个实例的UML图,加深理解: