Facade(外观模式)
意圖
為子系統中的一組接口提供一個一致的界面,_Facade_模式定義了一個高層接口,這個接口使得這一子系統更加易用。
動機
將一個系統劃分成為若干個子系統有利于降低系統的復雜性。一個常見的設計目標是使子系統間的通信和相互依賴關系達到最小。達到該目標的途徑之一就是引入一個外觀對象,它為子系統中較為一般的設施提供了一個單一而簡單的界面。
比如,我們現在有一個Scheudle Server(調度服務器),它為客戶提供了開機,讀取初始化配置文件,加載驅動,釋放資源,關閉文件,關閉電源等等API,而客戶每次使用它,從開機到開始使用的每一步都需要自己配置,當然這些接口非常重要,但是我們就是想簡單的使用,不需要自定義配置,因此,我們需要一套簡單的接口,該接口會為我們完成機器的一系列操作,而我們只要專注于我們的具體業務邏輯。這_Facade_模式的作用。
適用性
在遇到以下情況使用_Facade_模式:
- 為一個復雜的系統提供一個簡單的接口。子系統往往因為不斷演化而變得越來越復雜。大多數模式使用時都會產生更多更小的簡單類。這樣使得系統更具可重用性,也更容易對子系統進行定制,但這也給那些不需要定制系統的用戶帶來了一些使用上的困難。_Facade_模式可以給我們一個缺省的配置,而這一配置對絕大多數用戶足夠了。比如我們使用電腦的時候,我們不會逐一項的對系統進行配置,它默認的配置對我們來說就夠用了,而如果你要讓系統提供web、ftp等服務時,為了達到最好的性能,就可能詳細的配置一下。_Facade_就是我們需要的那個缺省配置。
- 當你需要構建一個層次結構的子系統時,使用_Facade_模式定義子系統中的每層入口點。如果子系統之間是相互依賴的,你可以使用_Facade_進行通訊,從而簡化它們的依賴關系。
結構
參與者
- Facade
- 知道哪些子系統負責處理請求
- 將客戶的請求代理給適當的子系統對象
- Subsystem classes
- 實現子系統功能
- 處理Facade指派的任務
- 沒有Facade的信息,及沒有指向Facade的引用或指針。
協作
- 客戶程序通過發送請求給Facade的方式與子系統通訊,Facade將消息轉發給合適的子系統對象。盡管是子系統的相關對象做實際的工作,但Facade模式本身也必須將它的接口轉換成子系統的接口。
- 使用Facade的客戶程序不需要直接訪問子系統對象。
相關模式
_Abstract Factory_模式與_Facade_模式一起使用可以提供一個接口,這一接口可用來以一種子系統獨立的方式創建子系統對象。_Abstract Factory_也可以代替_Facade_模式隱藏那些與平臺相關的類。
_Mediator_模式與_Facade_模式的相似之處是,它抽象了一些已有的類的功能。然而,_Mediator_的目的是對同事之間的任意通信進行抽象,通常集中不屬于任何單個對象的功能。_Mediator_的同事對象知道中介者并與它通信,而不是直接與其它同類對象通信。相對而言,_Facade_模式僅對于系統對象的接口進行抽象,從而使它們更容易使用:它并不定義新功能,子系統也不知道_Facade_的存在。
通常來講,僅需要一個Facade對象,因此Facade對象通常屬于_Singleton_模式。
轉載于:https://www.cnblogs.com/xiaojintao/p/6358562.html
總結
以上是生活随笔為你收集整理的Facade(外观模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网管的自我修养-网络系统
- 下一篇: LintCode Find the We