Façade Pattern

Façade pattern, 门面模式,是一种结构模式。

问题引入

你不需要弄懂手机或者电视内部构造,就能很好地使用它们,但如果不搞懂医院或正土共政府的内部流程,你肯定会很不顺利。

医院就诊

相信这种噩梦般的体验会让你印象深刻。生病了,一般精神状态是不太好的,却不得不打足精神去医院。好,到了医院,可不省事,挂号,交钱,就诊,如果医生发现你还需去别的科室诊断的话,继续挂号,交钱,如果医生要化验如查血啥的,你还的跑去交钱,就诊结束了,你再拿着药单去交钱,取药——这些全部都要你自己去跑腿。跑腿小事,问题是不知道往那地方跑!每次都问,问的老子都烦。看一次病,你要和医院各类窗口打交道N次,让你心存畏惧。医院他妈的,不能设立一个窗口,让病人一次把这些事情办完吗?

改进设想:病人和医院交互,但病人并不熟悉医院的方方面面,也不太可能了解,医院如果提供一个单一窗口,让病人只和这个窗口交互就OK了。挂号,交钱等事情,全由这个窗口中的工作人员完成就好。

政府办事

先不说门难进脸难看话难听,这里就说事难办。老子上次去查医保,先是到甲部门,甲部门说你得先去乙部门,甲乙部门可有两站路,老子又跑去乙部门,乙部门办完再喊老子去丙部门,乙丙部门也不近。我肏土共他娘,网络时代都十几年了,你他妈不能提供一个窗口让我一次把事情办完吗?

改进设想:公民去政府办事,公民对政府系统内部工作流程并不了解,也没精力了解,政府可以提供单一的接待窗口,公民只要到这个接待窗口就OK了。至于要找甲部门,乙部门,丙部门的,由这个窗口的工作人员完成就行。

商场导购

这也许是唯一能找到的正面实例了。商场有多个商家入驻,购物时,多数时候也不会只买一个商家的货,但一般不需要单独付费,而是出商场时,在收银台一次把商品的钱付了,至于不同商家的收入,就不用顾客考虑了,商场会和商家结算。这里商场就做得很好,设立一个单一的窗口,极大方便了顾客。

手机使用

用手机打电话,直接使用按键或触摸屏就可以了,并不需要直接去操作手机内部的集成电路。这个经验值得思考,手机把整个复杂的软硬件系统封装在一个壳子下,用户完全不用关心内部怎么工作的,只要和壳子上的按键和触摸屏交互就行了。

门面模式

通过以上的几个例子,已经看出我们需要这么一种模式了:将复杂系统封装起来,提供单一而简单的窗口,供用户使用。这个窗口就是所谓的门面,整个结构,就是所谓的门面模式。

复杂系统一般称之为子系统(subsystem),如下图所示,给子系统的系列接口提供一个统一的总接口(Façade):

facade pattern

使用

门面模式是一个很有意思的模式,在使用第三方复杂系统时特别有用,比如要开发一个功能,需要用到一个复杂系统,但只用到这个系统的部分功能,我们并不想去学习这个系统的方方面面,那么就请熟悉这个复杂系统的同学开发几个调用接口,供我们开发新功能使用就可以了,这几个调用接口就是所谓的门面。我们只需要学习这个门面就可以使用那个复杂系统了,正如学会遥控器,就能操作电视了。降低了学习开发成本。

在层次化结构中,可以使用Facade模式定义系统中每一层的入口。如在使用 Struts2 时,为每个模块设计一个 action,也算是 facade 了。

其他

  1. 这个模式满足 OO 设计原则中的最小知识原则。
  2. 门面模式能提高子系统的独立性

参考

设计模式(15)-Facade Pattern http://www.cnblogs.com/zhenyulu/articles/55992.html