天天看點

C# 設計模式--外觀模式(Facade)

     一個良好的面向對象應用程式應該是一個最小的類,這個類能夠把其他可重用類的行為有效的組織起來。對一個子系統的類進行重構,直到每個類都有一個進行良好定義功能目标,是以代碼易于維護。外觀模式(Facade)的目的是提供一個接口,通過這個接口可以使一個子系統更容易使用。它(Facade)将客戶的請求代理給适合的子系統對象。客戶通過發送請求給(Facade)的方式與子系統通信。使用(Facade)的客戶不需要直接通路子系統對象。 它對客戶屏蔽了子系統元件,減少了客戶處理的對象的數目。(1)

C# 設計模式--外觀模式(Facade)

(Facade)模式示意性對象圖(2)

代碼如下:

C# 設計模式--外觀模式(Facade)

using  System;

C# 設計模式--外觀模式(Facade)

using  System.Collections.Generic;

C# 設計模式--外觀模式(Facade)

using  System.Text;

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

namespace  Facade

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

... {

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

    /// <summary>

C# 設計模式--外觀模式(Facade)

    /// 子系統一,該子系統僅含有一個類

C# 設計模式--外觀模式(Facade)

    /// </summary>

C# 設計模式--外觀模式(Facade)

    public class DrawLine

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

    ...{

C# 設計模式--外觀模式(Facade)

        private int _point;

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        /// <summary>

C# 設計模式--外觀模式(Facade)

        /// 構造函數

C# 設計模式--外觀模式(Facade)

        /// </summary>

C# 設計模式--外觀模式(Facade)

        /// <param name="point">畫線的數量</param>

C# 設計模式--外觀模式(Facade)

        public DrawLine(int point)

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            this._point = point;

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        /// <summary>

C# 設計模式--外觀模式(Facade)

        /// 畫下劃線

C# 設計模式--外觀模式(Facade)

        /// </summary>

C# 設計模式--外觀模式(Facade)

        public void DrawUnderline()

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            for (int i = 0; i < _point; i++)

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

            ...{

C# 設計模式--外觀模式(Facade)

                Console.WriteLine("_");

C# 設計模式--外觀模式(Facade)

            }

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        /// <summary>

C# 設計模式--外觀模式(Facade)

        /// 畫中劃線

C# 設計模式--外觀模式(Facade)

        /// </summary>

C# 設計模式--外觀模式(Facade)

        public void DrawMiddleline()

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            for (int i = 0; i < _point; i++)

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

            ...{

C# 設計模式--外觀模式(Facade)

                Console.WriteLine("--");

C# 設計模式--外觀模式(Facade)

            }

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)

    }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

    /// <summary>

C# 設計模式--外觀模式(Facade)

    /// 子系統二,該子系統也僅含有一個類

C# 設計模式--外觀模式(Facade)

    /// </summary>

C# 設計模式--外觀模式(Facade)

    public class ShowData

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

    ...{

C# 設計模式--外觀模式(Facade)

        private string  _defaultValue;

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        /// <summary>

C# 設計模式--外觀模式(Facade)

        /// 構造函數

C# 設計模式--外觀模式(Facade)

        /// </summary>

C# 設計模式--外觀模式(Facade)

        /// <param name="defaultValue">預設值</param>

C# 設計模式--外觀模式(Facade)

        public ShowData(string defaultValue)

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            this._defaultValue = defaultValue;

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        /// <summary>

C# 設計模式--外觀模式(Facade)

        /// 顯示詳細的資料

C# 設計模式--外觀模式(Facade)

        /// </summary>

C# 設計模式--外觀模式(Facade)

        /// <param name="time">參數一</param>

C# 設計模式--外觀模式(Facade)

        /// <param name="outsideValue">參數二</param>

C# 設計模式--外觀模式(Facade)

        public void ShowParticularData(int time, string outsideValue)

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            for (int i = 0; i < time; i++)

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

            ...{

C# 設計模式--外觀模式(Facade)

                Console.WriteLine(outsideValue);

C# 設計模式--外觀模式(Facade)

                Console.WriteLine("|");

C# 設計模式--外觀模式(Facade)

            }

C# 設計模式--外觀模式(Facade)

            Console.WriteLine(" ");

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        /// <summary>

C# 設計模式--外觀模式(Facade)

        /// 顯示簡單的資料

C# 設計模式--外觀模式(Facade)

        /// </summary>

C# 設計模式--外觀模式(Facade)

        /// <param name="outsideValue"></param>

C# 設計模式--外觀模式(Facade)

        public void ShowShortData(string outsideValue)

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            Console.WriteLine(_defaultValue + ":" + outsideValue);

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)

    }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

    //使用外觀模式,向外提供各個子系統的功能

C# 設計模式--外觀模式(Facade)

    public class Facade

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

    ...{

C# 設計模式--外觀模式(Facade)

        private int _times;

C# 設計模式--外觀模式(Facade)

        private string _defaultValue;

C# 設計模式--外觀模式(Facade)

        private DrawLine dl;

C# 設計模式--外觀模式(Facade)

        private ShowData sd;

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        public Facade(int times, string defaultValue)

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            _times = times;

C# 設計模式--外觀模式(Facade)

            _defaultValue = defaultValue;

C# 設計模式--外觀模式(Facade)

            dl = new DrawLine(_times);

C# 設計模式--外觀模式(Facade)

            sd = new ShowData(_defaultValue); 

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        /// <summary>

C# 設計模式--外觀模式(Facade)

        /// 完成任務一:畫下劃線,顯示詳細的資料

C# 設計模式--外觀模式(Facade)

        /// </summary>

C# 設計模式--外觀模式(Facade)

        public void DrawPicture()

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            dl.DrawUnderline();

C# 設計模式--外觀模式(Facade)

            sd.ShowParticularData(_times, _defaultValue); 

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        /// <summary>

C# 設計模式--外觀模式(Facade)

        /// 完成任務二:畫中劃線,顯示簡單的資料

C# 設計模式--外觀模式(Facade)

        /// </summary>

C# 設計模式--外觀模式(Facade)

        public void DrawImage()

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            dl.DrawMiddleline();

C# 設計模式--外觀模式(Facade)

            sd.ShowShortData(_defaultValue);

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

    }

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

    /// <summary>

C# 設計模式--外觀模式(Facade)

    /// 客戶類

C# 設計模式--外觀模式(Facade)

    /// </summary>

C# 設計模式--外觀模式(Facade)

    public class Client

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

    ...{

C# 設計模式--外觀模式(Facade)

        private const int _times = 10;

C# 設計模式--外觀模式(Facade)

        private const string _defaultValue = "預設值";

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        static void Main(string[] args)

C# 設計模式--外觀模式(Facade)
C# 設計模式--外觀模式(Facade)

        ...{

C# 設計模式--外觀模式(Facade)

            //---------- 非使用Facade模式時,常見的用法--------------------

C# 設計模式--外觀模式(Facade)

            Console.WriteLine("非使用Facade模式時,常見的用法. ");

C# 設計模式--外觀模式(Facade)

            DrawLine dl = new DrawLine(_times);

C# 設計模式--外觀模式(Facade)

            ShowData sd = new ShowData(_defaultValue);            

C# 設計模式--外觀模式(Facade)

            dl.DrawUnderline();

C# 設計模式--外觀模式(Facade)

            dl.DrawMiddleline();            

C# 設計模式--外觀模式(Facade)

            sd.ShowParticularData(_times, _defaultValue);

C# 設計模式--外觀模式(Facade)

            sd.ShowShortData(_defaultValue);

C# 設計模式--外觀模式(Facade)

            //-------------------結束--------------------------------------

C# 設計模式--外觀模式(Facade)

            //---------- 使用Facade模式的用法--------------------

C# 設計模式--外觀模式(Facade)

            Console.WriteLine(" 使用Facade模式的用法. ");

C# 設計模式--外觀模式(Facade)

            Facade fc = new Facade(_times, _defaultValue);

C# 設計模式--外觀模式(Facade)

            fc.DrawPicture();

C# 設計模式--外觀模式(Facade)

            fc.DrawImage();

C# 設計模式--外觀模式(Facade)

            //-------------------結束--------------------------------------

C# 設計模式--外觀模式(Facade)

        }

C# 設計模式--外觀模式(Facade)

    }

C# 設計模式--外觀模式(Facade)

}

     客戶程式與抽象類的實作部分之間存在很大的依賴性,引入Facade将這個子系統與客戶以及其他的子系統的分析,可以提供子系統的獨立性和可移植性。建構一個層次結構的子系統時使用定義子系統中每層的入口點。如果子系統之間是互相依賴,你可以讓它們僅通過進行通信,進而簡化了它們之間的依賴關系。(3)

    .NET架構中的外觀模式(Facade)(4):

C# 設計模式--外觀模式(Facade)

    在這個架構中,總共分為四個邏輯層,分别為:使用者層UI,業務外觀層Business Façade,業務規則層Business Rule,資料通路層Data Access。其中Business Façade層的職責如下:

(1) 從“使用者”層接收使用者輸入

(2) 如果請求需要對資料進行隻讀通路,則可能使用“資料通路”層

(3) 将請求傳遞到“業務規則”層

(4) 将響應從“業務規則”層傳回到“使用者”層

(5) 在對“業務規則”層的調用之間維護臨時狀态

    Facade有助于建立層次結構的系統,實作了子系統與客戶之間的松耦合關系,子系統内部的功能元件往往是緊耦合的。松耦合關系使得子系統的元件變化不會影響到它的客戶。Facade消除了複雜的循環依賴關系。這一點在客戶程式與子系統分别實作的時候格外重要。(3) 

參考資料:

(1)《C# 設計模式》《 Desing Patterns in C#》(美)Steven John Metsker 著, 顔炯 譯。

(2)http://www.j2medev.com/Article/Class3/pattern/200511/1020.html

(3)設計模式 可複用面向對象軟體的基礎 Design Patterns Elements of Reusable Object-Oriented Software 》(美)Erich Gamma Richard Helm Ralph Johnson John Vlissides 著,李英軍 等譯。

(4)http://www.cnblogs.com/Terrylee/archive/2006/03/17/352349.html

繼續閱讀