外觀模式 - 設計模式學習

  外觀模式(Facade),爲子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。javascript

  怎麼叫更加容易使用呢?多個方法變成一個方法,在外觀看來,只需知道這個功能完成哪些功能就OK了,沒必要記得一大堆對象,一大堆方法。html

  外觀模式UML圖:java

    

  外觀模式的基本結構代碼:git

複製代碼
namespace ConsoleApplication1
{
    //四個子系統類
    class SubSystemOne
    {
        public void MethodOne()
        {
            Console.WriteLine("子系統方法一");
        }
    }

    class SubSystemTwo
    {
        public void MethodTwo()
        {
            Console.WriteLine("子系統方法二");
        }
    }

    class SubSystemThree
    {
        public void MethodThree()
        {
            Console.WriteLine("子系統方法三");
        }
    }

    class SubSystemFour
    {
        public void MethodFour()
        {
            Console.WriteLine("子系統方法四");
        }
    }
    
    //外觀類
    class Facade
    {
        SubSystemOne one;       //外觀類,它須要瞭解全部的子系統的方法或屬性,進行組合,以被外界調用
        SubSystemTwo two;
        SubSystemThree three;
        SubSystemFour four; 

        public Facade()
        {
            one = new SubSystemOne();
            two = new SubSystemTwo();
            three = new SubSystemThree();
            four = new SubSystemFour();
        }

        public void MethodA()       //這樣相對於外部來講,調用MethiodA方法就等於同時調用了3個方法,但外觀看起來是一個方法
        {
            Console.WriteLine("\n方法組A()");
            one.MethodOne();
            two.MethodTwo();
            four.MethodFour();
        }

        public void MethodB()
        {
            Console.WriteLine("\n方法組B()");  
            two.MethodTwo();
            three.MethodThree();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();
            facade.MethodA();
            facade.MethodB();

            Console.ReadKey();
        }
    }  
}
複製代碼

  回到《大話設計模式》裏的買股票例子:設計模式

複製代碼
namespace ConsoleApplication1
{
    //股票1
    class Stock1
    {
        //賣股票
        public void Sell()
        {
            Console.WriteLine("股票1賣出");
        }

        //買股票
        public void Buy()
        {
            Console.WriteLine("股票1買入");
        }
    }

    //股票2
    class Stock2
    {
        //賣股票
        public void Sell()
        {
            Console.WriteLine("股票2賣出");
        }

        //買股票
        public void Buy()
        {
            Console.WriteLine("股票2買入");
        }
    }

    //股票3
    class Stock3
    {
        //賣股票
        public void Sell()
        {
            Console.WriteLine("股票3賣出");
        }

        //買股票
        public void Buy()
        {
            Console.WriteLine("股票3買入");
        }
    }

    //國債1
    class NationalDebt1
    {
        //賣國債
        public void Sell()
        {
            Console.WriteLine("國債1賣出");
        }

        //買國債
        public void Buy()
        {
            Console.WriteLine("國債1買入");
        }
    }

    //房地產1
    class Realty1
    {
        //賣出房產
        public void Sell()
        {
            Console.WriteLine("房產1賣出");
        }

        //買房產
        public void Buy()
        {
            Console.WriteLine("房產1買入");
        }
    }

    class Fund
    {
        Stock1 gu1;
        Stock2 gu2;
        Stock3 gu3;
        NationalDebt1 nd1;
        Realty1 rt1;

        public Fund()
        {
            gu1 = new Stock1();
            gu2 = new Stock2();
            gu3 = new Stock3();
            nd1 = new NationalDebt1();
            rt1 = new Realty1();
        }

        public void BuyFund()
        {
            gu1.Buy();
            gu2.Buy();
            gu3.Buy();
            nd1.Buy();
            rt1.Buy();
        }

        public void SellFund()
        {
            gu1.Sell();
            gu2.Sell();
            gu3.Sell();
            nd1.Sell();
            rt1.Sell();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Fund jijin = new Fund();
            //基金購買
            jijin.BuyFund();
            //基金贖回
            jijin.SellFund();

            Console.ReadKey();
        }
    }  
}
複製代碼

  如何使用外觀模式:架構

  首先,在設計初期階段,應該要有意識的將不一樣的兩個層分離,好比經典的三層架構,就須要考慮在數據訪問層和業務邏輯層、業務邏輯層和表示層的層與層之間創建外觀Facade,這樣能夠爲複雜的子系統提供一個簡單的接口,使得耦合大大下降。post

  其次,在開發階段,子系統每每由於不斷的重構演化而變得愈來愈複雜。大多數模式的使用時也會產生不少很小的類,這本是好事,但也給外部調用它們的用戶程序帶來了使用上的困難,增長外觀Facade能夠提供一個簡單的接口,減小它們之間的依賴。學習

  最後,在維護一個遺留的大型系統時,可能這個系統已經很是難以維護和擴展了,但由於他包含很是重要的功能,新的需求開發必需要依賴於它。此時用外觀模式Facade也是很是合適的。你能夠爲新系統開發一個外觀Facade類,來提供設計粗糙或高難度複雜的遺留代碼的比較清晰簡單的接口,讓新系統與Facade對象交互,Facade與遺留代碼交互全部複雜工做。this

 

 

 

 

 

 

 
 
分類: 設計模式
 
0
0
 
(請您對文章作出評價)
 
« 上一篇: 模板方法模式- 設計模式學習
» 下一篇: 建造者模式 - 設計模式學習
相關文章
相關標籤/搜索