設計模式-外觀模式的理解

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

    在機房收費系統中,外觀模式用來解除U層和B層之間的耦合,按着以前的做法,在U層中的功能調用B層中的方法的時候,就需要U層完全瞭解B層中的方法都有哪些,自己的U層又是需要用到哪一個方法,再調用B層中的方法。這樣的做法使得B層的東西完全暴露在了U層中,而且增加了U層和B層兩者的耦合程度,B層做出的修改要考慮到U層的調用的問題,不利於系統的安全性。增加的外觀模式,把B層中的一組方法都放到外觀類Façade類中去,當U層需要調用B層的方法的時候,直接通過Façade類,而不用再去完全瞭解B層中的方法都有哪些是自己用的。這樣就定義了U層和B層之間的一個高層接口,爲B層中的一組方法提供了一個一致的界面,使得B層的方法更加安全也更加容易使用了。

    用通俗的話來講,外觀模式就是歸類和嵌套,把B層中的方法都歸類放到Façade類中,Façade類自己不用定義方法,都是嵌套的B層中的方法,實現高層接口的功能。當U層需要用的時候,就可以去Façade類裏面找到所有的方法名,不需要知道是誰提供的這些方法,也不需要知道這些方法是怎麼實現的,直接用Façade類裏面的方法名就可以實現自己的功能,這樣大大的解除了U層和其他層之間的耦合,使得U層可以專心致志的幹自己U層應該乾的事,也能提高系統性能,這些好處也是設計模式的優點。

    書上的例子:炒股票和基金。沒有設計模式的時候的實現過程是這樣的:

class Program
    {
        static void Main(string[] args)
        {
            Stock1 stock1 = new Stock1();
            Stock2 stock2 = new Stock2();
            stock1.Buy();
            stock2.Buy();
            stock1.Sell();
            stock2.Sell ();
            Console.Read();
        }
    }
    class  Stock1
    {
	   public void  Sell()
        {
		    Console.WriteLine ("股票1賣出");
        }
       public void Buy()
       {
           Console.WriteLine("股票1買進");
       }
    }
    class Stock2
    {
        public void Sell()
        {
            Console.WriteLine("股票2賣出");
        }
        public void Buy()
        {
            Console.WriteLine("股票2買進");
        }
    }
    結果是這樣的:


    而採用外觀模式後的代碼是這樣的:

class Program
    {
        static void Main(string[] args)
        {
            Facade facade = new Facade();
            facade.BuyFacade();
            facade.SellFacade();
            Console.Read();
        }
    }
    class Facade
    {
        Stock1 stock1;
        Stock2 stock2;
        public Facade()
        {
            stock1 = new Stock1();
            stock2 = new Stock2();
        }
        public void BuyFacade()
        {
            stock1.Buy();
            stock2.Buy();
        }
        public void SellFacade()
        {
            stock1.Sell();
            stock2.Sell();
        }
    }
    class  Stock1
    {
	   public void  Sell()
        {
		    Console.WriteLine ("股票1賣出");
        }
       public void Buy()
       {
           Console.WriteLine("股票1買進");
       }
    }
    class Stock2
    {
        public void Sell()
        {
            Console.WriteLine("股票2賣出");
        }
        public void Buy()
        {
            Console.WriteLine("股票2買進");
        }
    }
    結果同上,這個例子非常簡潔,所以我只是用來說明道理,如有不當之處還請諒解。外觀類Facade類中的方法的執行時根據自己需要的,如果上例中不想賣,就可以把SellFacade()方法去掉,應用的方法是靈活多變的,自己感悟很重要。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章