精读《设计模式 - Facade 外观模式》

Facade(外观模式)

Facade(外观模式)属于结构型模式,是一种平常开发中常常被使用到的设计模式。前端

意图:为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。git

举例子

若是看不懂上面的意图介绍,没有关系,设计模式须要在平常工做里用起来,结合例子能够加深你的理解,下面我准备了三个例子,让你体会什么场景下会用到这种设计模式。github

意图解释

图书管理员

图书馆是一个很是复杂的系统,虽然图书按照必定规则摆放,但也只有内部人员比较清楚,做为一位初次来的访客,想要快速找到一本书,最好的办法是直接问图书管理员,而不是先了解这个图书馆的设计,由于你可能要来回在各个楼宇间奔走,借书的流程可能也比较长。typescript

图书管理员就起到了简化图书馆子系统复杂度的做用,咱们只要凡事询问图书管理员便可,而不须要关心他是如何与图书馆内部系统打交道的。设计模式

最多跑一次便民服务

浙江省推出的最多跑一次服务很是方便,不少办事流程都简化了,不管是证件办理仍是业务受理,几乎只要跑一次,而必需要持续几天的流程也会经过手机短信或者 App 操做完成后续流程。微信

这就至关于外观模式,由于政府系统内部的办事流程可能没有太大变化,但经过抽象出 Facade(外观),让普通市民能够直接与便民办事处链接,而不须要在车管所与驾校之间来回奔波,背后的事情没有少,只是便民办事处帮你作了。this

Iphone 快捷指令功能

手机的 App 很是多,而咱们须要了解每一个功能在哪一个 App 上才能运用自如,而快捷指令功能能够将 App 的某些功能单独提取出来,造成一套新的功能组,咱们能够只接触到 “拍照” “付款” “计算”,而不用管背后是调用了支付宝仍是微信、系统内置摄像机仍是其余摄像 App,也不用关心这个 App 内部功能的入口在哪里,这些对接都在快接指令中自动完成。设计

快捷指令也是一种外观模式。code

意图解释

意图:为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。cdn

为下降一个拥有多个接口的子系统内部复杂性,咱们须要一个外观来屏蔽内部的复杂性,所以外观模式就是定义一个高层接口,这个接口直连子系统的内部实现,但调用这个高层接口的人不须要关心子系统内部的实现,这样,对于不想了解子系统内部实现的人来讲,提升了易用度。

固然若是想要深度定制,就能够绕过外观模式,直接使用子系统提供的类,因此说并非有了外观模式就必须经过外观调用,而是根据实际须要判断使用哪一种调用方式。

结构图

<img width=600 src="https://img.alicdn.com/tfs/TB1j9gZ3.T1gK0jSZFrXXcNCXXa-1082-412.png">

能够看到,Facade 直接指向子系统中的类,而子系统的类不会反向指向 Facade

代码例子

下面例子使用 typescript 编写。

// 假设一个子系统是三个类结合使用的,为了抽象而解耦开了
class A {
  constructor(b: B) {
    this.b = b
  }
}

class B {
  constructor(c: C) {
    this.c = c
  }
}

class C {
  
}

// 它们组合成了一种经常使用功能,咱们可使用外观模式屏蔽子类的细节直接使用
class Compile {
  public run() {
    const parser = new A(new B(new C))
    parser.run()
  }
}

const compile = new Compile()
compile.run()

这样咱们只要知道 Compile 类就能够了,而不须要了解背后的 A B C 以及其组合关系。

弊端

外观模式并不适合于全部场景,当子系统足够易用时,再使用外观模式就是多此一举。

另外,当系统难以抽象出通用功能时,外观模式的设计可能也无所适从,由于设计的高层接口可能适用范围很窄,此时外观模式的意义就比较小。

总结

其实抽象工厂模式也能够代替外观模式,来实现隐藏子类具体实现的效果,但外观模式描述更具备通用性。

讨论地址是: 精读《设计模式 - Facade 外观模式》· Issue #286 · dt-fe/weekly

若是你想参与讨论,请 点击这里,每周都有新的主题,周末或周一发布。前端精读 - 帮你筛选靠谱的内容。

关注 前端精读微信公众号

版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证

相关文章
相关标签/搜索