Facade模式
来自KlniuWiki
目录 |
1 问题
举一个生活中的小例子,大凡开过学或者毕过业的都会体会到这样一种郁闷:你要去n个地方办理n个手续(现在大学合并后就更加麻烦,因为可能那n个地方都隔的比较远)。但是实际上我们需要的就是一个最后一道手续的证明而已,对于前面的手续是怎么办的、到什么地方去办理我们都不感兴趣。
实际上在软件系统开发中也经常回会遇到这样的情况,可能你实现了一些接口(模块),而这些接口(模块)都分布在几个类中(比如A和B、C、D):A中实现了一些接口,B中实现一些接口(或者A代表一个独立模块,B、C、D代表另一些独立模块)。然后你的客户程序员(使用你设计的开发人员)只有很少的要知道你的不同接口到底是在那个类中实现的,绝大多数只是想简单的组合你的A-D的类的接口,他并不想知道这些接口在哪里实现的。
这里的客户程序员就是上面生活中想办理手续的郁闷的人!在现实生活中我们可能可以很快想到找一个人代理所有的事情就可以解决你的问题(你只要维护和他的简单的一个接口而已了!),在软件系统设计开发中我们可以通过一个叫做Façade的模式来解决上面的问题。
2 功能
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个高层接口使得这一子系统更加容易使用;
3 结构图

4 实现
Facade.h
//Facade.h #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_
Facade.cpp
//Facade.cpp #include "Facade.h" #include <iostream> using namespace std; Subsystem1::Subsystem1() { } Subsystem1::~Subsystem1() { } void Subsystem1::Operation() { cout<<"Subsystem2 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(); }
main.cpp
//main.cpp #include "Facade.h" #include <iostream> using namespace std; int main(int argc,char* argv[]) { Facade* f = new Facade(); f->OperationWrapper(); return 0; }
5 讨论
Facade模式在高层提供了一个统一的接口,解耦了系统。设计模式中还有另一种Mediator模式也和Facade有类似的地方。但是Mediator主要目的是对象间的访问的解耦(通讯时候的协议),具体请参见Mediator文档。
6 参见
- 设计模式解析之——FACADE模式. K_Eckel. 2005-07-08 20:41.
- C++设计模式08---Facade. 哥哥. 2008-06-25 23:57:44.