外观模式,很多人也把它叫做门面模式。在GOF的《设计模式:可复用面向对象软件的基础》一书中对外观模式是这样说的:将子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。细细的理解这句话;子系统中的一组接口,就好比上面举得例子中的语法分析,生成中间代码,生成汇编代码,链接成可执行程序或库;外观模式定义的一个高层接口,就好比上面说的Build按钮,通过这样的一个Build按钮,让编译器更加容易使用,对于这一点,从Linux C++/C转Windows C++/C的程序员是最有体会的。visual studio提供的强大功能,只需要一个Build按钮,就可以进行Build动作,而不需要去写makefile文件,然后再去执行一些命令进行编译。
优点
它对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目,并使得子系统使用起来更加方便;
它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的;松耦合系统使得子系统的组件变化不会影响到它的客户。外观模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。外观模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候尤为重要。
使用场合
1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变的越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具有可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。外观模式可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层;
2、当客户程序与抽象类的实现部分之间存在很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性;
3、当需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,我们就可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。
#include<iostream>
using namespace std;
class Scanner
{
public:
void Scan() { cout << "scanner" << endl; }
};
class Parser
{
public:
void Parse() { cout << "parser" << endl; }
};
class GenMindCode
{
public:
void GenCode() { cout << "GenMindCode" << endl; }
};
class GenMachineCode
{
public:
void GenCode() { cout << "GenMachineCode" << endl; }
};
class Compiler
{
public:
void run()
{
Scanner scanner;
Parser parser;
GenMindCode genMindCode;
GenMindCode genMachineCode;
scanner.Scan();
parser.Parse();
genMindCode.GenCode();
genMindCode.GenCode();
}
};
int main()
{
Compiler compiler;
compiler.run();
}