1、意图
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
2、适用性
在遇到以下情况使用Facade模式
1)当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省试图,这一试图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。
2)客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3)当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。
3、C++实例
// Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <atlstr.h>
#include <string>
using namespace std;
// 子系统
class SubSystemOne
{
public:
SubSystemOne()
{
}
public:
void MethodOne()
{
cout<<"SubSystemOne MethodOne"<<endl;
}
};
// 子系统
class SubSystemTwo
{
public:
SubSystemTwo()
{
}
public:
void MethodTwo()
{
cout<<"SubSystemTwo MethodTwo"<<endl;
}
};
// 子系统
class SubSystemThree
{
public:
SubSystemThree()
{
}
public:
void MethodThree()
{
cout<<"SubSystemThree MethodThree"<<endl;
}
};
// 子系统
class SubSystemFour
{
public:
SubSystemFour()
{
}
public:
void MethodFour()
{
cout<<"SubSystemFour MethodFour"<<endl;
}
};
// 外观类
class Facade
{
public:
Facade()
{
}
public:
void FacadeMethodA()
{
cout<<"Facade FacadeMethodA"<<endl;
one.MethodOne();
two.MethodTwo();
four.MethodFour();
}
void FacadeMethodB()
{
cout<<"Facade FacadeMethodB"<<endl;
one.MethodOne();
four.MethodFour();
}
private:
SubSystemOne one;
SubSystemTwo two;
SubSystemThree three;
SubSystemFour four;
};
int _tmain(int argc, _TCHAR* argv[])
{
Facade facade ;
facade.FacadeMethodA();
facade.FacadeMethodB();
return 0;
}