C#設計模式——面板模式

來源:互聯網
上載者:User

標籤:bool   man   notify   system   過程   check   包含   產業鏈   導致   

一、面板模式介紹:

面板模式為子系統的一組介面提供一個統一的介面。外觀定義了一個高層介面,使得子系統更容易使用。使用面板模式時,我們建立了一個統一的類,用來封裝子系統中一個或多個複雜的類,用戶端可以直接通過外觀類來調用內部子系統中方法,從而面板模式讓客戶和子系統之間避免了緊耦合,並且面板模式可以解決層結構分離、降低系統耦合度和為新舊系統互動提供介面功能。面板模式也稱作 ”門面“模式。

二、出現背景:

在軟體開發過程中,用戶端程式經常會與複雜系統的內部子系統進行耦合,從而導致用戶端程式隨著子系統的變化而變化,為了將複雜系統的內部子系統與用戶端之間的依賴解耦,就有了面板模式。

三、設計例子:

以筆記本的生產和銷售為例,在筆記本產業鏈系統中,筆記本倉庫為一個子系統,筆記本的銷售為另一個子系統,當採購員請購一定數量時,我們需要確認庫存是否滿足才會完成交易,庫存不足需要和採購員互動提示相應資訊。

四、相關代碼:

1、建立各子系統類,定義各自方法:

    /// <summary>    /// 筆記本倉庫子系統    /// </summary>    public class NoteBookFactory    {        /// <summary>        /// 驗證庫存是否滿足請購數        /// </summary>        /// <param name="qty"></param>        /// <returns></returns>        public bool CheckStock(int qty)        {            if (qty > 100)            {                return false;            }            return true;        }    }
    /// <summary>    /// 銷售筆記本子系統    /// </summary>    public class SellingNoteBook    {        /// <summary>        /// 銷售確認庫存不足後提示資訊        /// </summary>        /// <param name="notename"></param>        /// <returns></returns>        public bool Notify(string notename)        {            Console.WriteLine("{0}庫存不足", notename);            return false;        }    }

2、建立外觀類,提供統一介面:

    /// <summary>    /// 外觀類    /// </summary>    public class Facade    {        private NoteBookFactory production_note_book;        private SellingNoteBook selling_note_book;        public Facade()        {            production_note_book = new NoteBookFactory();            selling_note_book = new SellingNoteBook();        }        public bool Source(int qty, string notename)        {            //驗證庫存,如果庫存足夠返回true            if (production_note_book.CheckStock(qty))            {                return true;            }            //庫存不足提示訊息            return selling_note_book.Notify(notename);        }    }

3、調用

        public static Facade facade = new Facade();        static void Main(string[] args)        {            int demand = 100;            string notename = "聯想筆記本";            if (facade.Source(demand, notename))            {                Console.WriteLine("成功出售{0}台{1}!", demand, notename);            }            Console.ReadKey();        }    }

使用了面板模式之後,用戶端只依賴與外觀類,從而將用戶端與子系統的依賴解耦了,如果子系統發生改變,此時用戶端的代碼並不需要去改變。面板模式的實現核心主要是——由外觀類去儲存各個子系統的引用,實現由一個統一的外觀類去封裝多個子系統類,然而用戶端只需要引用這個外觀類,然後由外觀類來調用各個子系統中的方法。然而這樣的實現方式非常類似適配器模式,然而面板模式與適配器模式不同的是:適配器模式是將一個對象封裝起來以改變其介面,而外觀是將一群對象 ”封裝“起來以簡化其介面。它們的意圖是不一樣的,適配器是將介面轉換為不同介面,而面板模式是提供一個統一的介面來簡化介面

五、使用前提:

  1. 為一個複雜的子系統提供一個簡單的介面。
  2. 提供子系統的獨立性。
  3. 在層次化結構中,可以使用面板模式定義系統中每一層的入口,例如三層架構。

六、相關角色:

門面(Facade)角色:用戶端調用這個角色的方法。該角色知道相關的一個或多個子系統的功能和責任,該角色會將從用戶端發來的請求委派帶相應的子系統中去。

子系統(subsystem)角色:可以同時包含一個或多個子系統。每個子系統都不是一個單獨的類,而是一個類的集合。每個子系統都可以被用戶端直接調用或被門面角色調用。對於子系統而言,門面僅僅是另外一個用戶端,子系統並不知道門面的存在。

七、總結:

優點:

  1. 面板模式對客戶屏蔽了子系統組件,從而簡化了介面,減少了客戶處理的對象數目並使子系統的使用更加簡單。
  2. 面板模式實現了子系統與客戶之間的松耦合關係,而子系統內部的功能組件是緊耦合的。松耦合使得子系統的組件變化不會影響到它的客戶。

缺點:

  1. 如果增加新的子系統可能需要修改外觀類或用戶端的原始碼。

C#設計模式——面板模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.