一、概述
1、定义:为子系统的一组接口提供一个统一的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
2、外观模式又称为门面模式,是迪米特法则的一种具体实现
3、通过引入一个新的外观角色来降低原有系统的复杂度,同时降低客户类与子系统的耦合度
二、外观模式的结构
外观模式包含以下2个角色:
1、Facade(外观角色)
2、SubSystem(子系统角色)
三、UML图
四、模式优点
1、它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易
2、它实现了子系统与客户端之间松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可
3、一个子系统的修改对其它子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象
五、模式缺点
1、不能很好地限制客户端直接使用子系统类,如果客户端访问子系统类做太多的限制则减少了可变性和灵活性
2、如果设计不当,增加了新的子系统可能需要修改外观类的源代码,违背了开闭原则
六、示例代码
#include<iostream>
using namespace std;
class SubSystemA
{
public:
void methodA()
{
cout << "方法A!" << endl;
}
};
class SubSystemB
{
public:
void methodB()
{
cout << "方法B!" << endl;
}
};
class SubSystemC
{
public:
void methodC()
{
cout << "方法C!" << endl;
}
};
class Facade
{
public:
Facade()
{
m_objA = new SubSystemA;
m_objB = new SubSystemB;
m_objC = new SubSystemC;
}
~Facade()
{
delete m_objA;
m_objA = nullptr;
delete m_objB;
m_objB = nullptr;
delete m_objC;
m_objC = nullptr;
}
void method()
{
m_objA->methodA();
m_objB->methodB();
m_objC->methodC();
}
private:
SubSystemA* m_objA = nullptr;
SubSystemB* m_objB = nullptr;
SubSystemC* m_objC = nullptr;
};
int main()
{
Facade facade;
facade.method();
return 0;
}