一、简介
Facade门面模式是为了解决的问题是:在软件系统开发中也经常回会遇到这样的情况,可能你实现了一些接口(模块)都分布在几个类中(比如 A 和 B、C、D), A中实现了一些接口,B 中实现了另一些接口(或者 A 代表一个独立模块,B、C、D 代表另一些独立模块)。然后程序员(使用你设计的开发人员)只有很少的要知道你的不同接口到底是在那个类中实现的,绝大多数只是想简单的组合你的 A-D 的类的接口,并不想知道这些接口在哪里实现的。因此使用Facade 模式在高层提供了一个统一的接口,代理所有的事情,自己只需维护和他的简单接口而已。
Facade 模式的结构图:
仅需要一个Facade对象,因此Facade对象通常设置成Singleton 模式。
二、详解
1、代码实现
(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
2、运行结果
(Centos6.3系统中运行结果:)
三、总结
(1)使用Facade模式,客户程序不需要直接访问子系统对象。Facade模式有助于建立层次结构系统,有助于对对象之间的依赖关系分层,也可以消除复杂的循环依赖关系降低客户-子系统之间的耦合度。
(2)源码已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/8421907)。