学习软件设计,向OO高手迈进!
设计模式(Design pattern)是软件开发人员在软件开发过程中面临的一般问题的解决方案。
这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
是前辈大神们留下的软件设计的"招式"或是"套路"。
一个系统都是由各种大大小小不同功能的类组成的,每一个类都会提供被外部调用的接口,我们可以通过这些接口去使用这些类,但是客户端要一个个的去调用这些类非常的麻烦,而且也会造成客户类与子系统类耦合性高的问题,就如下图:

所以为了解决这种问题,我们需要定义一个高层接口,让这个高层接口去完成各个子系统类接口的调用,客户类就只需要对这个高层接口进行调用即可,这样降低了客户类与子系统类的耦合,也能让客户端更加方便的使用这个系统,这就是外观模式,也叫门面模式。如下图:

外观模式 (Facade Pattern) 隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。也就是说为子系统中的一组接口提供一个一致的入口,它定义了一个高层接口,这个接口使得相关子系统更加容易使用;这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

外观模式中的角色:
下面我们以IDE编译运行来讲解该模式:
平常我们使用IDE进行编译运行代码的时候,不需要我们去编写Makefile等文件。直接点击编译按钮或者F5就能进行编译并生产可执行文件。这就是一个比较典型的外观的例子。
对于客户端(用户)来讲,只要给文件路径,就能产生最终的结果。编译器内部所做的事情:扫描源文件、语法分析、代码优化、生成生产可执行程序等,对客户端来说是透明的。
一、定义各个子系统
//扫描源文件路径
class Scanner {
public:
void scan() {
cout << "scan source file" << endl;
}
};
//语法语义分析
class Parser
{
public:
void parse() {
cout << "parse syntax" << endl;
}
};
//代码优化
class Optimizer {
public:
void optimizer() {
cout << "optimize code" << endl;
}
};
//生成中间代码
class GenMiddleCode {
public:
void genMiddleCode() {
cout << "gen middle code" << endl;
}
};
//生产可执行程序
class GenMachineCode {
public:
void genMachineCode() {
cout << "gen executable code" << endl;
}
};
二、定义外观类
//提供一个外观类(编译器)
class Compiler
{
public:
void Compile() {
m_Scanner.scan();
m_Parser.parse();
m_Optimizer.optimizer();
m_GenMiddleCode.genMiddleCode();
m_GenMachineCode.genMachineCode();
}
private:
Scanner m_Scanner;
Parser m_Parser;
Optimizer m_Optimizer;
GenMiddleCode m_GenMiddleCode;
GenMachineCode m_GenMachineCode;
};
三、客户端
int main(int argc, char** argv) {
Compiler *compile = new Compiler();
compile->Compile();
return 0;
}
执行结果
scan source file
parse syntax
optimize code
gen middle code
gen executable code