門面模式的定義 定義: 要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行. 門面模式提供一個高層次的介面, 使得子系統更易於使用. 通俗的說, 就是設計一個類,專門用於對外服務的, 門面對象是外界訪問子系統內部的唯一通道 其類圖如下: 其中兩個角色如下: 子系統代碼如下: 門面對象代碼: ...
門面模式的定義
定義: 要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行. 門面模式提供一個高層次的介面, 使得子系統更易於使用.
通俗的說, 就是設計一個類,專門用於對外服務的, 門面對象是外界訪問子系統內部的唯一通道
其類圖如下:
其中兩個角色如下:
- Facade 門面角色: 客戶端可以調用這個角色的方法. 此角色知曉子系統的所有功能和責任. 一般情況下, 本角色會將所有從客戶端發來的請求委派到相應的子系統去, 也就是說該角色沒有實際的業務邏輯, 只是一個委托類
- Subsystem 子系統角色: 可以同時有一個或多個子系統. 每一個子系統都不是一個單獨的類, 而是一個類的集合.子系統並不知道門面的存在. 對於子系統而言, 門面僅僅是另外一個客戶端而已
子系統代碼如下:
門面對象代碼:
門面模式的應用
門面模式的優點:
- 減少系統的相互依賴. 如果不使用門面模式, 外界訪問直接深入到子系統內部, 相互之間是一種強耦合關係, 這樣的強依賴是系統設計所不能接受的. 門面模式的出項很好的解決了這個問題, 所有的依賴都是對門面對象的依賴, 與子系統無關.
- 提高了靈活性. 依賴減少了, 靈活性自然提高了.
- 提高安全性. 想讓你訪問子系統的哪些業務就開通那些邏輯, 不在門面上開通的方法, 休想訪問到
門面模式的缺點:
門面模式最大的缺點就是不符合開閉原則, 對修改關閉, 對擴展開放. 一旦在系統投產後發現有一個小錯誤, 怎麼解決? 完全最從開閉原則,根本沒辦法解決. 唯一能做的一件事就是修改門面對象的代碼, 這個風向相當大.
門面模式的使用場景:
- 為一個複雜的模塊或子系統提供一個供外界訪問的介面
- 子系統相對獨立--外界對子系統的訪問只要黑箱操作即可.
- 預防低水平人員帶來的風險擴散.
門面模式的註意事項
1.一個子系統可以有多個門面
- 門面已經龐大到不能忍受的重讀. 當一個門面對象過於龐大, 雖然都是非常簡單的委托操作, 也建議拆分成多個門面,否則會給以後的維護和擴展帶來不必要的麻煩. 按照功能拆分是一個非常好的原則, 比如一個資料庫操作的門面可以拆分為增刪改查等
- 子系統可以提供不同訪問路徑, 當有兩個不同的高層模塊來訪問子系統, 模塊二屬於受限訪問對象, 只能訪問methodB 方法, 如何處理呢?
增加的門面非常簡單, 委托給已經存在的門面對象來處理. 這樣可以儘量保持相同的代碼只編寫一遍, 避免以後到處修改相似代碼的悲劇.
2.門面不參與子系統內的業務邏輯
門面對象中不要出現具體的業務邏輯代碼, 否則就會產生一個倒依賴的問題, 在門面模式中, 門面角色應該是穩定的, 它不應該經常變化, 一個系統一旦投入運行他就不應該被改變, 它是一個系統對外的介面, 變來變去還怎麼保證其他模塊的穩定運行呢?
如果一定要出現業務處理, 應該建立一個封裝類, 封裝完畢後提供給門面對象使用.
門面模式是一個很好的封裝方法, 一個子系統比較複雜時, 比如演算法或者業務比較複雜, 就可以封裝出一個或多個門面出來, 項目的介面簡單, 而且擴展性非常好. 還有, 對於一個較大的項目, 為了避免人員帶來的風險, 也可以使用門面模式.