外观模式
前言
外观一词来自于英文单词Facade,这个词常用来表示一个建筑物的外观,而隐藏其内部的细节。外观模式(Facade Pattern)用来隐藏一个软件系统的所有内部细节,只提供给客户(Client)类一个外观类,或者叫做接口类。客户类直接调用该外观类的方法即可,而不必关心这些方法对其他类的调用的内部细节。
在Java 语言中,JDBC 是一个众所周知的典型的外观类,它为用户(程序员)提供了所有关于数据库连接和访问的功能。用户只要调用这些功能即可,而不必关心JDBC 是怎样实现这些功能的。
下面将列举一个生活中的外观模式的实例。
例:政府机构的接待员代理问题:
政府机构的机关部门比较多,如果一个公司人员到政府机关办一件事,往往要到各相关部门办理审批文件,需花费大量的时间与精力。如果采用了接待员代理工作模式,则办事程序将被简化,客户只需将申请材料交到接待员窗口,由接待员受理并代替客户到各个机构办理响应的手续。这样,客户所需要做的只是到接待员窗口提交材料,而不必了解各机关部门办事的详细流程。见图所示:
概念
在《设计模式》一书中对外观模式的描述为:为子系统中的一组接口提供一个一致地界面,外观模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。
类设计图
外观模式设计类图:
介绍
- 使用外观模式的目的:
为一系列复杂的接口提供一个统一的接口,使该系统更容易使用。这个统一的接口认为是更高级的接口,提供足够的功能,供客户程序直接调用,而复杂的对类库的调用则被隐藏在该接口中,实际上由该接口负责调用。 - 外观模式由三个角色组成:
(1) 外观角色(Facade):这是外观模式的核心。它被客户角色调用,因此它熟悉子系统的功能。其内部客户角色已有的需求预定了几种功能组合。
(2) 子系统角色:实现子系统的功能,对它而言,外观角色就是和客户角色一样未知的,它没有任何外观角色的信息和连接。
(3) 客户角色:调用外观角色来完成要得到的功能 - 外观模式的优缺点:
外观模式的优点:利用外观模式可以去掉子系统与客户程序间的直接绑定,从而提高子系统的独立性,也降低了客户程序与子系统的直接耦合度。此外,利用外观模式可以使系统层次化。
外观模式的缺点:对于那些不需要定制的用户来说,例如一个熟练的程序员要写一些复杂的功能,而外观类中没有这样的功能,因此外观模式可能对于他们没有帮助。在这种情况下,用户程序可以直接绕过外观模式,而直接调用子系统类库。 - 外观模式与适配器模式的相似和不同之处:
外观模式和适配器模式都是为了设计心得接口而存在的。
两种模式的不同之处在与:
(1) 适配器模式转换接口的目的是将一个不适合使用的接口转换成可以被使用的接口,或者将一些接口不同而功能相同或者相近的接口加以转换,以便可以被统一使用。
(2) 外观模式简化接口是为了更好的使用某个类库。外观模式提供一个易使用的接口作为它的外观,只是为了使现有代码client 和要使用到的类库(往往包含多个具有不同行为、不同接口的对象)通过这个新定义的Target 接口能被简单地使用。
应用场景
例:重要部门保安系统的设计
重要部门保安系统是一个基于网络的综合系统,负责防火、防盗等。例如当发生火灾时,该系统能自动启动消防装置并自动打电话给消防队;当发生强盗事件时,能够自动拍照等。这里要编写一个保安系统软件,完成上述功能。
1. 类设计图
2. 代码
代码连接:【例3.10】-外观模式-安全系统
水滴涟漪终消散,木记轮回恋此生