Facade(外觀模式)屬於結構型模式,是一種平常開發中常常被使用到的設計模式。前端
意圖:爲子系統中的一組接口提供一個一致的界面,Facade 模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。git
若是看不懂上面的意圖介紹,沒有關係,設計模式須要在平常工做裏用起來,結合例子能夠加深你的理解,下面我準備了三個例子,讓你體會什麼場景下會用到這種設計模式。github
圖書館是一個很是複雜的系統,雖然圖書按照必定規則擺放,但也只有內部人員比較清楚,做爲一位初次來的訪客,想要快速找到一本書,最好的辦法是直接問圖書管理員,而不是先了解這個圖書館的設計,由於你可能要來回在各個樓宇間奔走,借書的流程可能也比較長。typescript
圖書管理員就起到了簡化圖書館子系統複雜度的做用,咱們只要凡事詢問圖書管理員便可,而不須要關心他是如何與圖書館內部系統打交道的。設計模式
浙江省推出的最多跑一次服務很是方便,不少辦事流程都簡化了,不管是證件辦理仍是業務受理,幾乎只要跑一次,而必需要持續幾天的流程也會經過手機短信或者 App 操做完成後續流程。微信
這就至關於外觀模式,由於政府系統內部的辦事流程可能沒有太大變化,但經過抽象出 Facade(外觀),讓普通市民能夠直接與便民辦事處鏈接,而不須要在車管所與駕校之間來回奔波,背後的事情沒有少,只是便民辦事處幫你作了。this
手機的 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 許可證)