Facade门面模式是为了解决的问题是:在软件系统开发中也经常回会遇到这样的情况,可能你实现了一些接口(模块)都分布在几个类中(比如 A 和 B、C、D), A中实现了一些接口,B 中实现了另一些接口(或者 A 代表一个独立模块,B、C、D 代表另一些独立模块)。然后程序员(使用你设计的开发人员)只有很少的要知道你的不同接口到底是在那个类中实现的,绝大多数只是想简单的组合你的 A-D 的类的接口,并不想知道这些接口在哪里实现的。因此使用Facade 模式在高层提供了一个统一的接口,代理所有的事情,自己只需维护和他的简单接口而已。
Facade 模式的结构图:
仅需要一个Facade对象,因此Facade对象通常设置成Singleton 模式。
(1)代码facade.h:
#ifndef _FACADE_H_ #define _FACADE_H_ class Subsystem1; class Subsystem2; class Facade { public: static Facade *GetInstance(); static void CloseInstance(); void OperationWrapper(); protected: Facade(); ~Facade(); private: Subsystem1* _subs1; Subsystem2* _subs2; static Facade* _instance; }; class Subsystem1 { public: Subsystem1(); ~Subsystem1(); void Operation(); protected: private: }; class Subsystem2 { public: Subsystem2(); ~Subsystem2(); void Operation(); protected: private: }; #endif(2)代码facade.cpp:
#include <iostream> #include "facade.h" using namespace std; Facade* Facade::_instance = NULL; Facade *Facade::GetInstance() { if (!_instance) { _instance = new Facade(); } return _instance; } void Facade::CloseInstance() { if (_instance) delete _instance; } Facade::Facade() { _subs1 = new Subsystem1(); _subs2 = new Subsystem2(); } Facade::~Facade() { if (_subs1) delete _subs1; if (_subs2) delete _subs2; } void Facade::OperationWrapper() { cout<<"Facade::OperationWrapper"<<endl; _subs1->Operation(); _subs2->Operation(); } Subsystem1::Subsystem1() { } Subsystem1::~Subsystem1() { } void Subsystem1::Operation() { cout<<"---Subsystem1 Operation..."<<endl; } Subsystem2::Subsystem2() { } Subsystem2::~Subsystem2() { } void Subsystem2::Operation() { cout<<"---Subsystem2 Operation..."<<endl; }(3)代码main.cpp:
#include <iostream> #include "facade.h" using namespace std; int main() { Facade *fd = Facade::GetInstance(); fd->OperationWrapper(); Facade::CloseInstance(); return 0; }(4)makefile:
CFLAGS = -g DEFINED = #-D _VERSION LIBS = CC = g++ INCLUDES = -I./ OBJS= main.o facade.o TARGET= main all:$(TARGET) $(TARGET):$(OBJS) $(CC) $(CFLAGS) -o $@ $(OBJS) .SUFFIXES:.o .h .SUFFIXES:.cpp .o .cpp.o: $(CC) $(DEFINED) -c $(CFLAGS) -o $@ $< ok: ./$(TARGET) clean: rm -f $(OBJS) $(TARGET) core *.log
(Centos6.3系统中运行结果:)
(1)使用Facade模式,客户程序不需要直接访问子系统对象。Facade模式有助于建立层次结构系统,有助于对对象之间的依赖关系分层,也可以消除复杂的循环依赖关系降低客户-子系统之间的耦合度。
(2)源码已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/8421907)。