门面模式/外观模式

门面模式(Facade),它隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。通过对客户端提供一个统一的接口用于访问子系统中的一群接口。

优缺点:

1、子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统模块进行交互,只需要跟门面类交互就可以了。

2、将客户端与子系统解耦,使得子系统内部模块更容易扩展和维护

3、通过使用Facade更好的划分访问层次,有些方法是对外的,有些方法是对内的,把需要对外的功能集中到门面中,方便了客户端的调用。

效果图如下所示:

Java设计模式之门面模式_门面模式

 如上图所示,子系统的使用变得更加简单,客户端只需要与Facade外观角色交互,降低了系统的  耦合。所以Facade起到了解耦作用。

包含的角色:

  • Facade 门面角色:客户端可以调用这个角色的方法,该角色知晓相关子系统的功能。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
  • SubSystem 子系统角色:可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合(如上面的子系统就是由 SubSystemA、SubSystemB、SubSystemC、SubSystemD 几个类组合而成)。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面角色仅仅是另外一个客户端而已。

案例:奥迪A4L汽车启动

如果要启动奥迪A4L,例如包括发动起启动、齿轮转动、车灯两起 三个步骤

如果不使用门面模式,那可能启动步骤都在一个方法里面写,可读性差而且不易读懂

Java设计模式之门面模式_解耦_02

如果使用了门面模式,三个步骤的实现类:

Java设计模式之门面模式_解耦_03

 门面facade类:

Java设计模式之门面模式_门面模式_04

 测试客户端调用:

Java设计模式之门面模式_客户端_05

Java设计模式之门面模式_门面模式_06

 facade类相当于Engine、Wheel、Light三个模块的外观界面,有了facade类客户端就不需要亲自调用这三个模块了,也不用知道三个模块内部实现的细节,即客户端只需要和facade交互就行。

一句话:说白了门面模式就是对代码进行方法封装