Facade 外观对象结构模式:为子系统中的一级接口提供了一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Facade 的意图是希望简化原有系统的使用方式,定义自己的接口。当我们只需要使用某个复杂系统的子集,或者,需要以一种特殊的方式与系统交互时,可以使用 Facade 模式。Facade 适用于模式适用于:
1)当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难。Facade 可以提供一个简单的缺省视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过 Facade 层。
2)客户程序与抽象类的实现部分之间存在着很大的依赖性。引入 Facade 将这个子系统与客户以及其它的子系统分离,可以提高子系统的独立性和可移植性。
3)当你需要构建一个层次结构的子系统时,使用 facade 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们通过 facade 进行通讯,从而简化了它们之间的依赖关系。
Facade 的简单结构图如下:
Facade 模式的想法及结构图都非常简单,但却是应用最广泛的模式之一。以上类图可能太过简单,不足以表达 Facade 模式的真正涵义,设计模式一书给出的结构图更能表示 Facade 的作用:
Facade 知道哪些子类系统负责处理请求,将客户的请求代理给适当的子系统对象。SubSystem 实现子系统的功能,处理由 Facade 对象指派的任务,子系统没有 Facade 的任务相关信息,即没有指向 facade 的指针。Facade 将客户发送的请求转发给适当的子系统对象,尽管子系统中的有关对象在做实际工作,但 Facade 模式本身也必须将它的接口转换成子系统的接口。使用 Facade 的客户不需要直接访问子系统对象。
Facade 的简单代码如下:
1: //Facade.h
2: #pragma once
3: #include
4:
5: class Subsystem1
6: {
7: public:
8: Subsystem1(){ }
9: ~Subsystem1(){ }
10: void Operation()
11: {
12: std::cout << "Subsystem1 operation.." << std::endl;
13: }
14: };
15: class Subsystem2
16: {
17: public:
18: Subsystem2(){ }
19: ~Subsystem2(){ }
20: void Operation()
21: {
22: std::cout << "Subsystem2 operation.." << std::endl;
23: }
24: };
25:
26: // Facade
27: class Facade
28: {
29: public:
30: Facade()
31: {
32: _subs1 = new Subsystem1();
33: _subs2 = new Subsystem2();
34: }
35: ~Facade()
36: {
37: delete _subs1;
38: delete _subs2;
39: }
40:
41: void OperationWrapper()
42: {
43: _subs1->Operation();
44: _subs2->Operation();
45: }
46: private:
47: Subsystem1* _subs1;
48: Subsystem2* _subs2;
49: };
50:
51: int main()
52: {
53: Facade* f = new Facade();
54: f->OperationWrapper();
55:
56: return EXIT_SUCCESS;
57: }
58: