外观模式,为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
由于子系统可能有多个,而且联系错综复杂,作为系统的使用者,我们不想也不需要去了解这些子系统之间的联系,只需要提供一个对外接口能够实现功能即可。这就是外观模式的作用。它使得我们不用关注里面的细节和联系,却能完成功能。
外观模式的例子很多,比如我们去酒店吃饭,我们只需要点一桌菜,然后坐等吃就可以了。至于酒店里面是谁洗菜,谁做菜,谁煲汤,于我何干,我们就只管菜美不美味。
再说一个编程相关的例子吧。Linux下开发程序,我们可以通过编写Makefile编译,也可以通过QT编译,当然也有其它的方式。这些方式基本都会包括查找头文件,编译,链接,生成可执行文件等步骤。对于开发者来说,我们只需要执行命令,然后坐等编译结果即可。至于中间各个编译子系统之家的复杂关系,我们根本不用理会。
由于子系统可能有多个,而且联系错综复杂,作为系统的使用者,我们不想也不需要去了解这些子系统之间的联系,只需要提供一个对外接口能够实现功能即可。这就是外观模式的作用。它使得我们不用关注里面的细节和联系,却能完成功能。
外观模式的例子很多,比如我们去酒店吃饭,我们只需要点一桌菜,然后坐等吃就可以了。至于酒店里面是谁洗菜,谁做菜,谁煲汤,于我何干,我们就只管菜美不美味。
再说一个编程相关的例子吧。Linux下开发程序,我们可以通过编写Makefile编译,也可以通过QT编译,当然也有其它的方式。这些方式基本都会包括查找头文件,编译,链接,生成可执行文件等步骤。对于开发者来说,我们只需要执行命令,然后坐等编译结果即可。至于中间各个编译子系统之家的复杂关系,我们根本不用理会。
这里用C++代码实现这个例子的外观模式,各个子系统用一个类来说明,同时为了使得例子简单,子系统用stataic静态函数说明,具体代码如下:
void TestFacade()
{
ProgramBuilder* b = new MakeBuider;
printf("输入了Make命令执行编译:\r\n\r\n");
b->Build();
delete b;
}
class FindMakeFile
{
public:
static void Find()
{
printf("查找Makefile文件,如果查找不到报错\r\n");
}
};
class SearchHeaderFiles
{
public:
static void Search()
{
printf("查找附加包含头文件等路径,搜索相关的头文件\r\n");
}
};
class Compiler
{
public:
static void Compile()
{
printf("调用gcc或者g++执行编译动作\r\n");
}
};
class Linker
{
public:
static void Link()
{
printf("调用ldd等链接库操作\r\n");
}
};
class OutputPorgram
{
public:
static void Output()
{
printf("生成并输出可执行程序文件\r\n");
}
};
//构建编译程序
class ProgramBuilder
{
public:
virtual void Build() = 0;
};
//通过Make命令只是构建程序
class MakeBuider : public ProgramBuilder
{
public:
virtual void Build()
{
FindMakeFile::Find();
SearchHeaderFiles::Search();
Compiler::Compile();
Linker::Link();
OutputPorgram::Output();
}
};