1. 程式人生 > >二十三種設計模式[10] - 外觀模式(Facade Pattern)

二十三種設計模式[10] - 外觀模式(Facade Pattern)

前言

       外觀模式,又稱門面模式,物件結構型模式。在《設計模式 - 可複用的面向物件軟體》一書中將之描述為“ 為系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用 ”。

模式

Facade_1

需要角色如下:

  • Facade(門面):子系統為外部提供的入庫,負責將外部的呼叫委派給子系統實現;
  • Subsystem(子系統);與Facade相互獨立,負責功能的實現;

場景

       在日常生活中,我們經常接觸到與外觀模式相識的場景。比如作業系統就是電腦提供給我們的Facade,用來控制電腦執行相應的操作。蘋果手機通過App Store下載APP,App Store就是提供給我們的Facade。如果沒有這些,我們在使用電腦時就需要使用匯編來操作電腦,在下載APP時就需要分別去每個APP的官網下載。由於Facade的存在使得我們更加方便的與其它事物互動。

Facade_2

示例

Facade_3

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中同時存在多個應用市場類軟體)能夠使這幾個系統對使用者更加透明。

Facade_4

總結

       外觀模式,就是把一個系統對外提供的操作進行封裝讓使用者更加方便的使用,並且將使用者與系統進行解耦,使系統的內部模組更容易擴充套件與維護。但使用者方便使用的同時也犧牲了該系統對於使用者的靈活性。


       以上,就是我對外觀模式的理解,希望對你有所幫助。

       示例原始碼:https://gitee.com/wxingChen/DesignPatternsPractice

       系列彙總:https://www.cnblogs.com/wxingchen/p/10031592.html

       本文著作權歸本人所有,如需轉載請標明本文連結(https://www.cnblogs.com/wxingchen/p/10078618.html)