2011/04/27

[Design Patterns] 外觀模式(Facade)


參考 大話設計模式
定義:
為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
使用時機:
1.系統設計初期階段,三層式架構中層與層之間建立 Facade
2.開發階段,子系統的不斷演化,會產生許多的小類別,造成用戶程式調用難度,此時可以加入 Facade ,建立簡單的介面,減少依賴
3.在維護一個遺留的大型系統時,也許是個棕地,已經非常難以維護和擴展了,但又不能棄之不理,因為還有點賺頭 XD ;
用 Facade 將難用的舊系統大包,提供比較清晰簡單的介面,讓新系統與 Facade 互動,Facade  與舊系統的程式碼溝通。

結構圖:來源
2011-4-27 下午 11-17-24
說明:
Facade:外觀類別,知道哪些子系統負責處理請求,將客戶的請求代理給適當的子系統物件
SubSystem:處理 Facade 物件指派的任務

程式碼:
class Program
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();

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

            Console.Read();

        }
    }

    /// <summary>
    /// 子系統類別一。
    /// </summary>
    class SubSystemOne
    {
        public void MethodOne()
        {
            Console.WriteLine(" 子系統方法一");
        }
    }

    /// <summary>
    /// 子系統類別二。
    /// </summary>
    class SubSystemTwo
    {
        public void MethodTwo()
        {
            Console.WriteLine(" 子系統方法二");
        }
    }

    /// <summary>
    /// 子系統類別三。
    /// </summary>
    class SubSystemThree
    {
        public void MethodThree()
        {
            Console.WriteLine(" 子系統方法三");
        }
    }

    /// <summary>
    /// 子系統類別四。
    /// </summary>
    class SubSystemFour
    {
        public void MethodFour()
        {
            Console.WriteLine(" 子系統方法四");
        }
    }

    /// <summary>
    /// 外觀類別。
    /// </summary>
    class Facade
    {
        //宣告子系統變數
        SubSystemOne one;
        SubSystemTwo two;
        SubSystemThree three;
        SubSystemFour four;

        /// <summary>
        /// 建構函式。
        /// </summary>
        public Facade()
        {
            one = new SubSystemOne();
            two = new SubSystemTwo();
            three = new SubSystemThree();
            four = new SubSystemFour();
        }

        /// <summary>
        /// 開放對外 methodA。
        /// </summary>
        public void MethodA()
        {
            Console.WriteLine("\n方法組A() ---- ");
            one.MethodOne();
            two.MethodTwo();
            four.MethodFour();
        }

        /// <summary>
        /// 開放對外 methodB。
        /// </summary>
        public void MethodB()
        {
            Console.WriteLine("\n方法組B() ---- ");
            two.MethodTwo();
            three.MethodThree();
        }
    }

運行結果:
2011-4-27 下午 11-33-07 

Reference:
Design Pattern: Facade 模式
Facade
wiki Facade pattern
設計模式之Facade(外觀) 板橋里人

0 Comments:

張貼留言