【設計模式】外觀

—阿輝發表於2021-08-17

外觀模式介紹

外觀的表現

也叫門面模式,主要解決的是降低呼叫方的使用介面的複雜邏輯組合。有時候也會被用在中介軟體層,將服務中的通用性的複雜邏輯進行中介軟體層包裝,讓使用方可以只關心業務開發。可增強程式碼的隔離性,以及複用性。

對於外觀模式的使用通常是用在複雜或多個介面進行包裝統一對外提供服務上。

說的通俗一點就是:外觀模式就是將一些複雜類的眾多可供呼叫的方法或介面進行高度的整合或整合,將其放到一個外部類中,並讓其業務方進行呼叫和使用。

電話購物

就和上面電話購物一樣,呼叫者只需要知道電話號碼即可,其餘的交給電話導購員,由她們去確認需要那些貨物,如何找到貨物,如何發貨等細節問題。這裡的電話導購員其實就是貨物的外觀。

外觀模式結構

1、外觀 提供一種訪問特定子系統功能的便捷方式,其瞭解如何重定向客戶端請求,知曉如何操作一切活動部件。

2、建立附加外觀 類可以避免多種不相關的功能誤解單一外觀,使其變成又一個複雜結構。

3、複雜子系統 由數十個不同物件構成。如果要使用這些子系統模組,那麼就必須掌握其實現和關聯細節,比如正確的呼叫順序等。

4、客戶端 使用外觀代替對子系統物件的直接呼叫。

需要一個指向複雜子系統的直接介面,且該介面的功能有限,則可以使用外觀模式。

實現方式

  • 考慮能否在現有子系統的基礎上提供一個更簡單的藉口。如果該介面能讓客戶端程式碼獨立於眾多子系統類,那麼你的方向就是正確的。

  • 在一個新的外觀類中宣告並實現該介面。外觀應將客戶端程式碼的呼叫重定向到子系統中的相應物件處。如果客戶端程式碼沒有對子系統進行初始化,也沒有對其後續生命週期進行管理,那麼外觀必須完成此類工作。

  • 如果要充分發揮這一模式的優勢,你必須確保所有客戶端程式碼僅通過外觀來與子系統進行互動。此後客戶端程式碼將不會受到任何由子系統程式碼修改而造成的影響,比如子系統升級後,你只需修改外觀中的程式碼即可。

  • 如果外觀過於臃腫,你可以考慮將其部分行為抽取為一個新的專用外觀類。

外觀模式雖然降低了程式的整體複雜度,但它同時也有助於將不需要的依賴移動到同一位置。

Demo

  • 子系統模組
    /// <summary>
    /// 子系統模組程式碼   One
    /// </summary>
    public class SubSystemOne
    {
        public string operationOne() 
        {
            return "我是One子系統中的模組,你稍等片刻。\n";
        }

        public string operationOneN()
        {
            return "我是One子系統中的N模組,你稍等片刻。\n";
        }
    }
    
    /// <summary>
    /// 子系統模組程式碼   Two
    /// </summary>
    public class SubSystemTwo
    {
        public string operationTwo()
        {
            return "我是Two子系統中的模組,你稍等片刻。\n";
        }

        public string operationTwoS()
        {
            return "我是Two子系統中的S模組,你稍等片刻。\n";
        }
    }
  • 外觀類
    /// <summary>
    /// 外觀模式
    /// </summary>
    public class FacadeMode
    {
        protected SubSystemOne _one;
        protected SubSystemTwo _two;

        public FacadeMode(SubSystemOne one,SubSystemTwo two)
        {
            _one=one;
            _two=two;
        }

        public string Operation() 
        {
            string result = "外觀類輸出的:\n";
            result += this._one.operationOne();
            result += this._two.operationTwo();
            result += "第二行:\n";
            result += this._one.operationOneN();
            result += this._two.operationTwoS();
            return result;
        }
    }
  • 客戶端
    /// <summary>
    /// 客戶端
    /// </summary>
    public class Client
    {
        public static void ClientCode(FacadeMode fMode) 
        {
            Console.WriteLine(fMode.Operation());
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            SubSystemOne one = new SubSystemOne();
            SubSystemTwo two = new SubSystemTwo();
            FacadeMode fMode = new FacadeMode(one,two);
            Client.ClientCode(fMode);
            Console.ReadKey();
        }
    }

輸出結構

具體程式碼的流程圖

比較來看外觀模式還是比較簡單也很好理解的一種設計模式,在平常的呼叫第三方控制元件或介面的時候經常使用到這種模式,只是我們沒有留心觀察。它說的簡單點就是將一個複雜的系統,對其進行提煉需要的模組或方法,將其整合為一個類的方法中供外部進行呼叫即可(有時候這個類需要管理其複雜模組或系統的完整生命週期),這樣子使用者不需要知道內部類具體要幹些什麼,他只需要呼叫這個外部暴露的方法就可以。

小寄語

人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。

我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。

相關文章