標籤: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(); } }
使用了面板模式之後,用戶端只依賴與外觀類,從而將用戶端與子系統的依賴解耦了,如果子系統發生改變,此時用戶端的代碼並不需要去改變。面板模式的實現核心主要是——由外觀類去儲存各個子系統的引用,實現由一個統一的外觀類去封裝多個子系統類,然而用戶端只需要引用這個外觀類,然後由外觀類來調用各個子系統中的方法。然而這樣的實現方式非常類似適配器模式,然而面板模式與適配器模式不同的是:適配器模式是將一個對象封裝起來以改變其介面,而外觀是將一群對象 ”封裝“起來以簡化其介面。它們的意圖是不一樣的,適配器是將介面轉換為不同介面,而面板模式是提供一個統一的介面來簡化介面。
五、使用前提:
- 為一個複雜的子系統提供一個簡單的介面。
- 提供子系統的獨立性。
- 在層次化結構中,可以使用面板模式定義系統中每一層的入口,例如三層架構。
六、相關角色:
門面(Facade)角色:用戶端調用這個角色的方法。該角色知道相關的一個或多個子系統的功能和責任,該角色會將從用戶端發來的請求委派帶相應的子系統中去。
子系統(subsystem)角色:可以同時包含一個或多個子系統。每個子系統都不是一個單獨的類,而是一個類的集合。每個子系統都可以被用戶端直接調用或被門面角色調用。對於子系統而言,門面僅僅是另外一個用戶端,子系統並不知道門面的存在。
七、總結:
優點:
- 面板模式對客戶屏蔽了子系統組件,從而簡化了介面,減少了客戶處理的對象數目並使子系統的使用更加簡單。
- 面板模式實現了子系統與客戶之間的松耦合關係,而子系統內部的功能組件是緊耦合的。松耦合使得子系統的組件變化不會影響到它的客戶。
缺點:
- 如果增加新的子系統可能需要修改外觀類或用戶端的原始碼。
C#設計模式——面板模式