門面模式(外觀模式)

1.產生背景

  • 爲何須要門面模式 

 

我是一個辛苦一生的農民,攢了幾十年錢,如今日子好了,也想建一套屬於本身的小洋樓;spring

首先,我要僱一個搬磚的和一個和泥的,還要一個會砌牆的人;但是我到哪裏去找這些人,還要一個一個跟他們談價錢;不知道他們和不和得來,會不會幹一半不幹了;編程

哎,好煩;微服務

要是有一我的什麼都會就好,我只要跟他談,他一我的就能幫我把房子建好; 
總之,我就是想省心; 
 spa

2.概念
提供一個統一的接口去訪問多個子系統的多個不一樣的接口,它爲子系統中的一組接口提供一個統一的高層接口。使用子系統更容易使用。.net

本質:就是化零爲整;引入一箇中介類,把各個分散的功能組合成一個總體,只對外暴露一個統一的接口;代理

這兩年流行微服務,即化整爲零,把一個大服務拆分紅一個個零部件; 
而門面模式則是反其道,是化零爲整;對象

3.目的
爲了用戶使用方便,把過分拆分的分散功能,組合成一個總體,對外提供一個統一的接口blog

4.解決方案
本質:引入一個第三方中介類,這個類集合了多個零部件類的功能,實際功能則委託給這些零部件對象,這個類只是作爲對外的統一接口,只是一個馬甲;繼承

引入中介對象
有許多細粒度的小對象
中介對象暴露了這些小對象的功能;
中介對象實際功能委託給這些小對象
中介對象提供給外部使用(對外隱藏那些小對象)接口

圖片來自百科 

5. 類圖

全部實現類的地方均可以面向抽像編程(增長接口)

6.優缺點
優勢:
鬆耦合 
用戶與子系統解耦,屏蔽子系統;能夠提升子系統的獨立性;

使用簡單 
簡化用戶與子系統的依賴關係; 
用戶只與門面對接,有統一的入口;不須要知道全部子系統及內部構造;

缺點:
不規範的編程方式 
沒有面向抽象編程,而是經過增長中介層,轉換服務提供方的服務接口;
最核心的目的:簡化子系統,簡化客戶使用,屏蔽多個子系統

7.應用場景
A:簡化子系統複雜性時。
B:監控全部子系統時;經過門面控制了入口,能夠統一監控;
C:但願封裝和隱藏子系統時;
D:兩歷史系統進行改造並打通關係時;
8.現實案例
spring ApplicationContext; 
它實現了Factory、ResourceLoader等接口,並經過引用這些接口的實例,對外統一提供:加載配置、解析資源、建立Bean、提供環境、啓動流程等功能;

客戶代碼只須要操做context就能夠獲取spring的提供的功能,而無需關心內部的細節;

9.注意事項
「與代理模式的區別」 
在瞭解門面模式時,會發現它不只與代理模式很像,與裝飾器模式也很相似; 
它們之間到底有什麼樣的區別呢?

類似點: 
- 都引入了中介類(對象) 
- 中介對象都引用並把功能委託給了原對象 
- 都起到了」代理」功能

區別  - 代理側重於對原對象的訪問控制(固然也能夠不是控制而是功能加強)  - 代理與原類實現相同的抽象(相同接口或直接繼承原業)  - 代理只代理一個類  - 門面側重於功能整合(多個小系統或小對象整合成一個功能豐富的大對象)  - 門面能夠與子系統具備不一樣的抽象(具備不一樣的接口,能夠對方法從新起名)  - 門面代理的是一系列類

相關文章
相關標籤/搜索