二十三種設計模式[10] - 外觀模式(Facade Pattern)
前言
外觀模式,又稱門面模式,物件結構型模式。在《設計模式 - 可複用的面向物件軟體》一書中將之描述為“ 為系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用 ”。
模式
需要角色如下:
- Facade(門面):子系統為外部提供的入庫,負責將外部的呼叫委派給子系統實現;
- Subsystem(子系統);與Facade相互獨立,負責功能的實現;
場景
在日常生活中,我們經常接觸到與外觀模式相識的場景。比如作業系統就是電腦提供給我們的Facade,用來控制電腦執行相應的操作。蘋果手機通過App Store下載APP,App Store就是提供給我們的Facade。如果沒有這些,我們在使用電腦時就需要使用匯編來操作電腦,在下載APP時就需要分別去每個APP的官網下載。由於Facade的存在使得我們更加方便的與其它事物互動。
示例
public class AppA { public void Download() { Console.WriteLine("尋找appA的下載地址"); Console.WriteLine("訪問appA的下載地址"); Console.WriteLine("開始下載"); Console.WriteLine("appA下載完畢"); } public void Install() { Console.WriteLine("尋找appA的安裝檔案"); Console.WriteLine("開始安裝"); Console.WriteLine("appA安裝完畢"); } } public class AppB { public void Download() { Console.WriteLine("尋找appB的下載地址"); Console.WriteLine("訪問appB的下載地址"); Console.WriteLine("開始下載"); Console.WriteLine("appB下載完畢"); } public void Install() { Console.WriteLine("尋找appB的安裝檔案"); Console.WriteLine("開始安裝"); Console.WriteLine("appB安裝完畢"); } } public class AppStoreFacade { private AppA _appA = null; private AppA appA { get { if(this._appA == null) { this._appA = new AppA() } return this._appA; } } private AppB _appB = null; private AppB appB { get { if(this._appB == null) { this._appB = new AppB() } return this._appB; } } public void DownloadAppA() { this.appA.Download(); Console.WriteLine("---------"); this.appA.Install(); } public void DownloadAppB() { this.appB.Download(); Console.WriteLine("---------"); this.appB.Install(); } } static void Main(string[] args) { AppStoreFacade facade = new AppStoreFacade(); facade.DownloadAppA(); Console.ReadKey(); }
如上所示,在Facade模式下,我們暴露給使用者的只有一個AppStoreFacade類,使用者只能通過該類使用該系統的某些功能時(比如下載APP),利用這個類使該系統對使用者透明。
在所有的設計模式中一直強調的就是“ 針對介面程式設計,而不是針對實現程式設計 ”。介面能夠保證所有實現類的一致性,方便我們對其進行擴充套件。所以我們可以將AppStoreFacade抽象出一個介面,並通過一個抽象工廠 (Abstract Factory) 來獲取Facade例項。這樣做的好處是在需求發生變更時只需要增加新的Facade類以及對應的抽象工廠例項即可。並且在同時存在多個系統需要對外提供Facade時(比如在Android中同時存在多個應用市場類軟體)能夠使這幾個系統對使用者更加透明。
總結
外觀模式,就是把一個系統對外提供的操作進行封裝讓使用者更加方便的使用,並且將使用者與系統進行解耦,使系統的內部模組更容易擴充套件與維護。但使用者方便使用的同時也犧牲了該系統對於使用者的靈活性。
以上,就是我對外觀模式的理解,希望對你有所幫助。
示例原始碼:https://gitee.com/wxingChen/DesignPatternsPractice
系列彙總:https://www.cnblogs.com/wxingchen/p/10031592.html
本文著作權歸本人所有,如需轉載請標明本文連結(https://www.cnblogs.com/wxingchen/p/10078618.html)