外觀模式的定義
Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
為子系統的接口集合提供一個統一接口,Facade定義高層接口使得子系統更容易使用。
外觀模式的動因
將系統分解為子系統有助於降低系統複雜性,系統的通用設計目標是最小化子系統間的通信和依賴。實現該設計目標的一種方式是引入外觀對象,為子系統中的通用設施提供一個單一併且簡單的接口。
拆分後的子系統可能非常多且複雜,外部客戶端直接與子系統類交互會導致複雜的交互關係,導致維護性降低,同時提高了系統間的耦合。
外觀模式的結構
外觀對象:Facade
- 知道請求由哪個子系統類負責響應
- 將客戶單請求委派給合適的子系統對象
子系統類:subsystem classes
- 實現子系統功能
- 處理分配到外觀對象的工作任務
- 對外觀對象無感知,不持有外觀對象引用
基於外觀模式,客戶端請求首先到達外觀類,並由外觀類負責路由並委託到具體的子系統類處理邏輯。由此,客戶端通過外觀類提供的一致接口對子系統進行間接訪問,解耦了客戶端與子系統。
外觀模式的優點
- 降低了系統相互依賴,客戶端只對外觀類進行依賴,與子系統實現類無關,降低了客戶端和子系統間的耦合
- 屏蔽複雜性:外觀類對子系統的複雜性進行了屏蔽,客戶端無需感知子系統的存在
- 提高安全性:外觀類對子系統類提供了安全訪問點,只允許需要暴露的子系統類才能通過外觀對象進行訪問
外觀模式的缺點
- 外觀對象僅僅是客戶端與子系統交互的可選方式,並不是唯一方式,客戶端依然可以直接訪問子系統。
- 不符合開閉原則,在不引入抽象外觀類的情況下,新增的需求可能需要修改外觀類。因此,需要對外觀類進行抽象以進行擴展。
外觀模式的適用場景
- 如果希望對複雜子系統提供一個簡單接口
- 如果在客戶端和某個抽象的實現類間存在過多的依賴
- 如果希望對子系統進行分層設計
與適配器模式區別
本質上二者的模式意圖不同:適配器是將接口轉換為不同接口,外觀模式是提供一個統一的接口來簡化子系統的訪問。
閱讀更多 瘋狂架構 的文章