设计模式探秘-20-门面模式(外观)

门面模式的学习与实践

门面模式(外观模式)

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

类图

  1. Facade 门面角色 客户端调用该角色的方法,该角色知晓子系统的所有功能和责任。该角色将所有从客户端发来的请求委派到相应的子系统,即该角色没有实际的业务逻辑,只是一个委托类。
  2. SubsystemClasses 子系统角色,可以同时存在一个或多个子系统,每个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在,对于子系统,门面仅仅是另一个客户端而已。

优点

  1. 减少系统的相互依赖
  2. 提高灵活性
  3. 提高安全性

缺点

不符合开闭原则,门面角色一旦出现问题,遵从开闭原则,没有好的解决方法,只能修改门面角色的代码。

使用场景

  1. 为法则的模块或子系统提供一个供外界访问的接口。
  2. 子系统相对独立,外界对子系统的访问只是黑箱操作而已。
  3. 预防低水平人员带来的风险扩散。

注意事项

  1. 一个子系统可以有多个门面
    1. 门面过于庞大
    2. 子系统可以提供不同访问路径
  2. 门面不参与子系统内的业务逻辑

扩展

实践

门面模式是很好的封装方法,一个子系统比较复杂时可以封装出一个或多个门面出来,项目结构简单,而且扩展性好。

简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>

using namespace std;

class Subsystem1
{
public:
Subsystem1()
{
}
~Subsystem1()
{
}
void Operation()
{
cout<<"Subsystem1 "<<__FUNCTION__<<endl;
}
};

class Subsystem2
{
public:
Subsystem2()
{
}
~Subsystem2()
{
}
void Operation()
{
cout<<"Subsystem2 "<<__FUNCTION__<<endl;
}
};

class Facade
{
public:
Facade()
{
m_pSub1 = new Subsystem1();
m_pSub2 = new Subsystem2();
}
~Facade()
{
delete m_pSub1;
delete m_pSub2;
}
void Operation()
{
cout<<"Facade "<<__FUNCTION__<<endl;
m_pSub1->Operation();
m_pSub2->Operation();
}
private:
Subsystem1 *m_pSub1;
Subsystem2 *m_pSub2;
};

int main()
{
Facade fac;
fac.Operation();
return 0;
}

参考资料

  1. 设计模式之禅
  2. GoF+23种设计模式解析