结构型 - 外观(Facade)

外观模式(Facade pattern) : 它提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。

抛砖引玉

举例,一般开具某某证明:需要去 n 个地方办理 n 个手续。但是,实际上我们需要的就是一个最后一道手续的证明而已,对于前面的手续是怎么办的、 到什么地方去办理我们都不感兴趣。

实际上在软件系统开发中也经常会遇到这样的情况,可能你实现了一些接口(模块),而这些接口(模块) 都分布在几个类中(比如 A 和 B、 C、 D)。 A 中实现了一些接口,B 中实现一些接口(或者 A 代表一个独立模块, B、 C、 D 代表另一些独立模块)。 然后,客户程序员(使用者)不需要知道你的不同接口到底是在那个类中实现的,绝大多数只是想简单的组合你的 A - D 的类的接口,他并不想知道这些接口在哪里实现的。

这里的客户程序员就是上面生活中想办理手续的郁闷的人!在现实生活中,我们可能很快地想到找一个人代理所有的事情就可以解决你的问题(你只要维护和他的简单的一个接口而已了!),在软件系统设计开发中我们可以通过一个叫做 Façade 的模式来解决上面的问题。

Facade 模式典型的结构图为:

Façade 模式的想法、 思路和实现都非常简单, 但是其思想却是非常有意义的。 并且 Façade 设计模式在实际的开发设计中也是应用最广、最多的模式之一

代码实现

#ifndef _FACADE_H_
#define _FACADE_H_

class Subsystem1
{
public:
	Subsystem1();
	~Subsystem1();
	void Operation();

protected:
private:
};

class Subsystem2
{
public:
	Subsystem2();
	~Subsystem2();
	void Operation();

protected:
private:
};

class Facade
{
public:
	Facade();
	~Facade();
	void OperationWrapper();

protected:
private:
	Subsystem1 *_subs1;
	Subsystem2 *_subs2;
};
#endif //~_FACADE_H_
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
#include "Facade.h"
#include <iostream>
using namespace std;

Subsystem1::Subsystem1()
{
}

Subsystem1::~Subsystem1()
{
}

void Subsystem1::Operation()
{
    cout << "Subsystem1 operation.." << endl;
}

Subsystem2::Subsystem2()
{
}

Subsystem2::~Subsystem2()
{
}

void Subsystem2::Operation()
{
    cout << "Subsystem2 operation.." << endl;
}

Facade::Facade()
{
    this->_subs1 = new Subsystem1();
    this->_subs2 = new Subsystem2();
}

Facade::~Facade()
{
    delete _subs1;
    delete _subs2;
}

void Facade::OperationWrapper()
{
    this->_subs1->Operation();
    this->_subs2->Operation();
}
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
#include "Facade.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
Facade* f = new Facade();
f->OperationWrapper();
return 0;
}
1
2
3
4
5
6
7
8
[root@VM-16-6-centos Facade]# ./FacadeTest
Subsystem1 operation..
Subsystem2 operation..
1
2
3

代码说明

Façade 模式的实现很简单,多余的解释完全是没有必要。

讨论

Façade 模式在高层提供了一个统一的接口,解耦了系统。 设计模式中还有另一种模式Mediator 也和 Façade 有类似的地方。但是 Mediator 主要目的是对象间的访问的解耦(通讯时候的协议),具体请参见 Mediator 文档。