A single class that hides the complexity of an entire subsystem. 为子系统中的一组接口提供一个一致性的界面,Facade 模式定义了一个高层接口,这个接口使得这个系统更加容易使用。
- 核心思想:将复杂的一系列操作,合并为高度抽象的方法调用。
- 性能,是需要相当考虑的问题。因为涉及 Facade 的时候需要考虑分析可能性的成本(抽象成本)。
- jQuery 的
$.getJSON()
是$.ajax()
的 Facade,$('xxx')
也是典型的范例。
动机:将一个系统划分为若干个子系统有利于降低系统的复杂性。一个常见的设计目标就是使子系统间的通信和互相依赖的关系达到最小。达到这个目的的途径之一就是引入一个 Facade 对象,将子系统中较为一般的设施提供一个简单的操作 API。
适用性:
- 当需要为一个复杂的子系统提供一个简单的接口时。Facade 可以同一个简单的缺省视图,这一视图对大部分用户来说已经足够,那些需要更多的定制性的用户则可以越过 Facade 层。
- 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入 Facade 将这个子系统与客户的其它子系统分离,以提高子系统的独立性以及可移植性。
- 当你需要构建一个层次结构的子系统时,使用 Facade 模式定义子系统中每层的入口点。如果子系统之间是互相依赖的,你可以让他们仅通过 Facade 进行通信,从而简化它们直接的结构关系。
效果:
- 屏蔽了子系统的实现,使客户处理的对象数目降低,并且使用起来更加方便。
- 使得子系统和客户之间「松耦合」。
- 如果应用需要,并不限制它们使用系统子类。
代码结构:
参考 jQuery
的实现思路。
class ViewportManager {
private _exchangeManager;
private _dragEngine;
private document;
setPreview() {
this._exchangeManager.focus(null);
this._dragEngine.empty();
this.document.enablePreviewModel();
}
resize() {}
}
class ExchangeManager {}
class DragEngine {}
Facade 类知道哪些子系统的职能,同时能够指导协调他们完成具体的「请求」。而对于子系统而言,完全并不知晓 Facade
对象的存在。