门面模式 -- Facade Pattern, 也叫做外观模式

WHAT

定义

Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

门面模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生。

类图

facade门面角色

客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任。

没有实际的业务逻辑,只是一个委托类。

subsystem子系统角色

可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。

子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

示意图

WHY

优势

  • 减少系统的相互依赖
    • 外界访问直接深入到子系统内如,系统之间的强依赖存有隐患
    • 当所有依赖都是对门面对象的依赖,则与子系统无关
  • 提高了灵活性
    • 依赖减少,灵活性自然提高
  • 提高安全性
    • 访问子系统的逻辑在门面上得到控制,未开通的,无法访问到

劣势

  • 不符合开闭原则(对修改关闭,对扩展开放)
    • 当系统投产后的更改,只能修改门面角色的代码

HOW

使用场景

  • 为一个复杂的模块或子系统提供一个供外界访问的接口
  • 子系统相对独立
    • 外界对子系统的访问只要黑箱操作即可
  • 预防低水平人员带来的风险扩散
    • 降低个人代码质量对整个项目的影响风险,在指定子系统中开发,然后提供门面接口进行访问操作。

注意事项

一个子系统可以有多个门面

  • 门面已经庞大到不能忍受的程度
  • 子系统可以通过不同访问路径
    • 有两个不同的高层模块访问子系统,模块一可以完整访问所有业务,模块二属于受限访问对象,只能访问特定方法

门面不参与子系统内的业务逻辑

在门面对象方法中调用多个子系统的接口,导致门面对象参与了业务逻辑(先执行,后执行)。这样会产生一个到依赖的问题,子系统必须依赖门面才能被访问。破坏了系统的封装性。

如何解决

新增一个封装类,封装了多个子系统的接口。门面对象调用封装类的方法。从而保证门面角色是稳定的,不会随业务逻辑改变而变化。

将容易变化的业务逻辑封装在子系统内部,无论如何变化,对于外界的访问者来说,方法是稳定的。


《设计模式之禅》 第23章 门面模式