转: http://www.shenmiguo.com/archives/2009/308_design-patterns-facade.html/comment-page-1
C++设计模式-外观
定义
为子系统中的一组接口提供一个一致的界面,外观(Facade
)模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构
![facade facade](http://www.shenmiguo.com/wp-content/uploads/2009/09/facade.jpg)
理解
1. Facade
提供一个高层接口,将客户的请求代理给适合的子系统(Subsystem
)对象,Facade
知道子系统的哪些对象来处理请求。
2. Subsystem
是一系列类的集合,处理Facade
指派的任务。Subsystem
不知道Facade
的信息。
要点
1.
一个复杂的系统包括若干个子系统,
Facade
模式为复杂子系统提供一个简单而统一的接口
。譬如编译系统包括代码扫描、语法分析、代码生成等流程,每一个流程可以成为一个子系统。客户编译代码并不想知道具体的细节流程,Facade
模式封装一套标准编译流程,就屏蔽了编译的具体流程,
简化了客户调用。下图可以看出应用Facade
场景:
![](http://www.shenmiguo.com/wp-content/uploads/2009/09/facade_subsystem.jpg)
2.
提高子系统的独立性和可移植性
。客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade
将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3.
当你需要构建一个层次结构的子系统时,使用
Facade
模式定义子系统中每层的入口点
。如果子系统之间是相互依赖的,你可以让它们仅通过Facade
进行通讯,从而简化了它们之间的依赖关系。
应用
源码以编译系统的例子说明外观模式。
源码
#include <iostream>
#include <string>
using namespace std;
//代码扫描读入
class CCodeScanner
{
public:
void Scan()
{
cout << "scan code" << endl;
}
};
//语法分析
class CCodeParser
{
public:
void Parse()
{
cout << "parse code" << endl;
}
};
//代码生成
class CCodeGenerator
{
public:
void Generate()
{
cout << "generate code" << endl;
}
};
//Facade
class CCompiler
{
public:
//更高层的统一接口
void Compile()
{
cout << "compile program…" << endl;
CCodeScanner scanner;
scanner.Scan();
CCodeParser parser;
parser.Parse();
CCodeGenerator generator;
generator.Generate();
}
};
int main()
{
CCompiler compiler;
compiler.Compile();
return 0;
}