C#設計模式系列:外觀模式(Facade)

libingql發表於2014-03-31

1. 外觀模式簡介

  外觀模式主要解決的問題:當有多個類要處理時,需要一個個類去呼叫,沒有複用性和擴充套件性。外觀模式將處理子類的過程封裝成操作,簡化客戶端的呼叫過程。

1.1 定義

  外觀模式(Facade)通過提供一個統一介面,來訪問子系統的多個介面。

  使用外觀模式時,建立一個統一的類,用來包裝子系統中一個或多個複雜的類,客戶端可以直接通過外觀類來呼叫內部子系統中方法。

  外觀模式讓客戶端與子系統之間避免緊耦合。

1.2 使用頻率

  

2. 外觀模式結構

2.1 結構圖

 

 

2.2>、參與者

  外觀模式參與者:

  ◊ Facade

    ° 知道哪些子系統類負責處理請求

    ° 將客戶的請求代理給相應的子系統物件

  ◊ Subsystem Classes

    ° 實現子系統的功能

    ° 處理由Facade物件指派的任務來協調子系統下各子類的呼叫方式

  在外觀模式中,外觀類Facade的方法OptionWrapper實現的就是以不同的次序呼叫下面類SubSystem1、SubSystem2的方法Operation,通過不同的Operation組合實現裝飾功能。

3、外觀模式結構實現

  SubSystemOne.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.FacadePattern.Structural
{
    public class SubSystemOne
    {
        public void MethodOne()
        {
            Console.WriteLine(" SubSystemOne Method");
        }
    }
}

  SubSystemTwo.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.FacadePattern.Structural
{
    public class SubSystemTwo
    {
        public void MethodTwo()
        {
            Console.WriteLine(" SubSystemTwo Method");
        }
    }
}

  SubSystemThree.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.FacadePattern.Structural
{
    public class SubSystemThree
    {
        public void MethodThree()
        {
            Console.WriteLine(" SubSystemThree Method");
        }
    }
}

  SubSystemFour.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.FacadePattern.Structural
{
    public class SubSystemFour
    {
        public void MethodFour()
        {
            Console.WriteLine(" SubSystemFour Method");
        }
    }
}

  Facade.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPatterns.FacadePattern.Structural
{
    public class Facade
    {
        private SubSystemOne _one;
        private SubSystemTwo _two;
        private SubSystemThree _three;
        private SubSystemFour _four;

        public Facade()
        {
            _one = new SubSystemOne();
            _two = new SubSystemTwo();
            _three = new SubSystemThree();
            _four = new SubSystemFour();
        }

        public void MethodA()
        {
            Console.WriteLine("\nMethodA() ---- ");
            _one.MethodOne();
            _two.MethodTwo();
            _four.MethodFour();
        }

        public void MethodB()
        {
            Console.WriteLine("\nMethodB() ---- ");
            _two.MethodTwo();
            _three.MethodThree();
        }
    }
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DesignPatterns.FacadePattern.Structural;

namespace DesignPatterns.FacadePattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();

            facade.MethodA();
            facade.MethodB();
        }
    }
}

  執行輸出:

MethodA() ----
 SubSystemOne Method
 SubSystemTwo Method
 SubSystemFour Method

MethodB() ----
 SubSystemTwo Method
 SubSystemThree Method
請按任意鍵繼續. . .

4、外觀模式應用分析

  外觀模式適用情形:

  ◊ 當要為一個複雜子系統提供一個簡單介面時,子系統往往因為不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類,這使得子系統更具可用性,也更容易對子系統進行定製。但這也給那些不需要定製子系統的使用者帶來一些使用上的困難。外觀模式可以提供一個簡單的預設檢視。這一檢視對大多數使用者來說已經足夠,而那些需要更多定製性的使用者可以越過Facade層。

  ◊ 客戶程式與抽象類的實現部分之間存在著很大的依賴性。引入外觀模式將這個子系統與客戶以及其他子系統分離,可以提高該子系統的獨立性和可移植性。

  ◊ 當需要構建有層次結構的子系統時,使用外觀模式定義每層的入口點。如果子系統間相互依賴,它們只需通過外觀進行通訊,從而簡化它們之間的依賴關係,

  外觀模式特點:

  ◊ 它實現了子系統對客戶的遮蔽,因而減少了客戶處理的物件數目並且使子系統使用起來更加方便。

  ◊ 它實現了子系統與客戶之間的鬆耦合關係。而子系統內部的功能元件往往是緊耦合的。鬆耦合關係使得子系統的元件變化不會影響到它的客戶。

  ◊ 外觀模式有助於建立系統的層次結構,也有助於對物件之間的依賴關係分層。

  ◊ 外觀模式可以消除複雜的迴圈依賴關係。這一點在客戶程式與子系統是分別實現的時候尤為重要。在大型軟體系統中降低編譯依賴性至關重要。在子系統類改變時,希望儘量減少重編譯工作以節省時間。

  ◊ 用外觀模式可以降低編譯依賴性,減少對重要系統做較小的改變所需的重編譯工作。

  ◊ 外觀模式有利於簡化系統在不同平臺之間的移植過程。因為編譯一個子系統一般不需要編譯所有其他子系統。

  ◊ 如果應用需要,外觀模式並不限制子系統類的使用。因此可以在系統易用性和通用性之間加以選擇。

相關文章