設計模式之-外觀模式

定義:

外觀模式(Facade Pattern):外部與一個子系統的通訊必須經過一個統一的外觀對象進行,爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。外觀模式又稱爲門面模式,它是一種對象結構型模式。git

外觀模式參與者

  • Facade:外觀類,知道哪些子系統類負責處理請求,將客戶的請求代理給適當的子系統對象。
  • Subsystem:子系統。

外觀模式基本代碼

Facade類:github

namespace FacadePattern.BasicStructure
{
    /// <summary>
    /// 外觀類
    /// </summary>
    class Facade
    {
        private SubSystemOne _subSystemOne;
        private SubSystemTwo _subSystemTwo;
        private SubSystemThree _subSystemThree;
        private SubSystemFour _subSystemFour;

        public Facade()
        {
            _subSystemOne = new SubSystemOne();
            _subSystemTwo = new SubSystemTwo();
            _subSystemThree = new SubSystemThree();
            _subSystemFour = new SubSystemFour();
        }

        public void MethodA()
        {
            Console.WriteLine("\n方法組A() ---");
            _subSystemOne.Method();
            _subSystemTwo.Method();
            _subSystemFour.Method();
        }
        public void MethodB()
        {
            Console.WriteLine("\n方法組B() ---");
            _subSystemTwo.Method();
            _subSystemThree.Method();
        }
    }
}

SubSystemOne類:spa

namespace FacadePattern.BasicStructure
{
    /// <summary>
    /// 子系統一
    /// </summary>
    class SubSystemOne
    {
        public void Method()
        {
            Console.WriteLine("子系統一的方法");
        }
    }
}

SubSystemTwo類:代理

namespace FacadePattern.BasicStructure
{
    /// <summary>
    /// 子系統二
    /// </summary>
    class SubSystemTwo
    {
        public void Method()
        {
            Console.WriteLine("子系統二的方法");
        }
    }
}

SubSystemThree類:code

namespace FacadePattern.BasicStructure
{
    /// <summary>
    /// 子系統三
    /// </summary>
    class SubSystemThree
    {
        public void Method()
        {
            Console.WriteLine("子系統三的方法");
        }
    }
}

SubSystemFour類:對象

namespace FacadePattern.BasicStructure
{
    /// <summary>
    /// 子系統四
    /// </summary>
    class SubSystemFour
    {
        public void Method()
        {
            Console.WriteLine("子系統四的方法");
        }
    }
}

客戶端調用代碼:blog

    static void Main(string[] args)
    {
        try
        {
            {//BasicStructure
                //因爲Facade的做用,客戶端根本不知道子4個子系統的存在
                Facade facade = new Facade();
                facade.MethodA();
                facade.MethodB();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }

結果以下:接口

用外觀模式實現筆記本電腦開機關機

場景模擬:本人天天都要給筆記本電腦開機關機,接下來就用外觀模式來模擬下。get

NotebookPowerSupply(筆記本電源)類——Facade類string

namespace FacadePattern.SituationSimulation
{
    /// <summary>
    /// 筆記本電腦電源鍵--至關於外觀類
    /// </summary>
    class NotebookPowerSupply
    {
        private OpenPowerSupply _openPowerSupply;
        private ClosePowerSupply _closePowerSupply;
        public NotebookPowerSupply()
        {
            _openPowerSupply = new OpenPowerSupply();
            _closePowerSupply = new ClosePowerSupply();
        }
        public void Open()
        {
            Console.WriteLine("\n--開啓電源方法");
            _openPowerSupply.Operation();
        }
        public void Close()
        {
            Console.WriteLine("\n--關閉電源方法");
            _closePowerSupply.Operation();
        }
    }
}

OpenPowerSupply(開啓電源)類——SubSystem類

namespace FacadePattern.SituationSimulation
{
    /// <summary>
    /// 打開電源
    /// </summary>
    class OpenPowerSupply
    {
        public void Operation()
        {
            Console.WriteLine("打開電源");
        }
    }
}

ClosePowerSupply(關閉電源)類——SubSystem類

namespace FacadePattern.SituationSimulation
{
    /// <summary>
    /// 關閉電源
    /// </summary>
    class ClosePowerSupply
    {
        public void Operation()
        {
            Console.WriteLine("關閉電源");
        }
    }
}

客戶端調用代碼:

    static void Main(string[] args)
    {
        try
        {
            {//SituationSimulation
                NotebookPowerSupply notebookPowerSupply = new NotebookPowerSupply();
                notebookPowerSupply.Open();
                notebookPowerSupply.Close();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }

結果以下:

優勢:

外觀模式的優勢

  • 對客戶屏蔽子系統組件,減小了客戶處理的對象數目並使得子系統使用起來更加容易。經過引入外觀模式,客戶代碼將變得很簡單,與之關聯的對象也不多。
  • 實現了子系統與客戶之間的鬆耦合關係,這使得子系統的組件變化不會影響到調用它的客戶類,只須要調整外觀類便可。
  • 下降了大型軟件系統中的編譯依賴性,並簡化了系統在不一樣平臺之間的移植過程,由於編譯一個子系統通常不須要編譯全部其餘的子系統。一個子系統的修改對其餘子系統沒有任何影響,並且子系統內部變化也不會影響到外觀對象。
  • 只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類。

缺點:

外觀模式的缺點

  • 不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性。
  • 在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。

適用環境:

在如下狀況下可使用外觀模式:

  • 當要爲一個複雜子系統提供一個簡單接口時可使用外觀模式。該接口能夠知足大多數用戶的需求,並且用戶也能夠越過外觀類直接訪問子系統。
  • 客戶程序與多個子系統之間存在很大的依賴性。引入外觀類將子系統與客戶以及其餘子系統解耦,能夠提升子系統的獨立性和可移植性。
  • 在層次化結構中,可使用外觀模式定義系統中每一層的入口,層與層之間不直接產生聯繫,而經過外觀類創建聯繫,下降層之間的耦合度。

總結:

  • 在外觀模式中,外部與一個子系統的通訊必須經過一個統一的外觀對象進行,爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。外觀模式又稱爲門面模式,它是一種對象結構型模式。
  • 外觀模式包含兩個角色:外觀角色是在客戶端直接調用的角色,在外觀角色中能夠知道相關的(一個或者多個)子系統的功能和責任,它將全部從客戶端發來的請求委派到相應的子系統去,傳遞給相應的子系統對象處理;在軟件系統中能夠同時有一個或者多個子系統角色,每個子系統能夠不是一個單獨的類,而是一個類的集合,它實現子系統的功能。
  • 外觀模式要求一個子系統的外部與其內部的通訊經過一個統一的外觀對象進行,外觀類將客戶端與子系統的內部複雜性分隔開,使得客戶端只須要與外觀對象打交道,而不須要與子系統內部的不少對象打交道。
  • 外觀模式主要優勢在於對客戶屏蔽子系統組件,減小了客戶處理的對象數目並使得子系統使用起來更加容易,它實現了子系統與客戶之間的鬆耦合關係,並下降了大型軟件系統中的編譯依賴性,簡化了系統在不一樣平臺之間的移植過程;其缺點在於不能很好地限制客戶使用子系統類,並且在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。
  • 外觀模式適用狀況包括:要爲一個複雜子系統提供一個簡單接口;客戶程序與多個子系統之間存在很大的依賴性;在層次化結構中,須要定義系統中每一層的入口,使得層與層之間不直接產生聯繫。

 

源代碼地址:https://github.com/houzhenhuang/DesignPattern

相關文章
相關標籤/搜索