我是一個辛苦一生的農民,攢了幾十年錢,如今日子好了,也想建一套屬於本身的小洋樓;spring
首先,我要僱一個搬磚的和一個和泥的,還要一個會砌牆的人;但是我到哪裏去找這些人,還要一個一個跟他們談價錢;不知道他們和不和得來,會不會幹一半不幹了;編程
哎,好煩;微服務
要是有一我的什麼都會就好,我只要跟他談,他一我的就能幫我把房子建好;
總之,我就是想省心;
spa
2.概念
提供一個統一的接口去訪問多個子系統的多個不一樣的接口,它爲子系統中的一組接口提供一個統一的高層接口。使用子系統更容易使用。.net
本質:就是化零爲整;引入一箇中介類,把各個分散的功能組合成一個總體,只對外暴露一個統一的接口;代理
這兩年流行微服務,即化整爲零,把一個大服務拆分紅一個個零部件;
而門面模式則是反其道,是化零爲整;對象
3.目的
爲了用戶使用方便,把過分拆分的分散功能,組合成一個總體,對外提供一個統一的接口blog
4.解決方案
本質:引入一個第三方中介類,這個類集合了多個零部件類的功能,實際功能則委託給這些零部件對象,這個類只是作爲對外的統一接口,只是一個馬甲;繼承
引入中介對象
有許多細粒度的小對象
中介對象暴露了這些小對象的功能;
中介對象實際功能委託給這些小對象
中介對象提供給外部使用(對外隱藏那些小對象)接口
圖片來自百科
全部實現類的地方均可以面向抽像編程(增長接口)
6.優缺點
優勢:
鬆耦合
用戶與子系統解耦,屏蔽子系統;能夠提升子系統的獨立性;
使用簡單
簡化用戶與子系統的依賴關係;
用戶只與門面對接,有統一的入口;不須要知道全部子系統及內部構造;
缺點:
不規範的編程方式
沒有面向抽象編程,而是經過增長中介層,轉換服務提供方的服務接口;
最核心的目的:簡化子系統,簡化客戶使用,屏蔽多個子系統
7.應用場景
A:簡化子系統複雜性時。
B:監控全部子系統時;經過門面控制了入口,能夠統一監控;
C:但願封裝和隱藏子系統時;
D:兩歷史系統進行改造並打通關係時;
8.現實案例
spring ApplicationContext;
它實現了Factory、ResourceLoader等接口,並經過引用這些接口的實例,對外統一提供:加載配置、解析資源、建立Bean、提供環境、啓動流程等功能;
客戶代碼只須要操做context就能夠獲取spring的提供的功能,而無需關心內部的細節;
9.注意事項
「與代理模式的區別」
在瞭解門面模式時,會發現它不只與代理模式很像,與裝飾器模式也很相似;
它們之間到底有什麼樣的區別呢?
類似點:
- 都引入了中介類(對象)
- 中介對象都引用並把功能委託給了原對象
- 都起到了」代理」功能
區別 - 代理側重於對原對象的訪問控制(固然也能夠不是控制而是功能加強) - 代理與原類實現相同的抽象(相同接口或直接繼承原業) - 代理只代理一個類 - 門面側重於功能整合(多個小系統或小對象整合成一個功能豐富的大對象) - 門面能夠與子系統具備不一樣的抽象(具備不一樣的接口,能夠對方法從新起名) - 門面代理的是一系列類