C#設計模式——面板模式
來源:互聯網
上載者:User
面板模式: 面板模式是很常用的模式,在軟體開發過程中,用戶端程式經常會與複雜系統的內部子系統進行耦合,從而導致用戶端程式隨著子系統的變化而變化,然而為了將複雜系統的內部子系統與用戶端之間的依賴解耦,從而就有了面板模式,也稱作 ”門面“模式。下面我為大家介紹一下有關面板模式的知識。
一、定義: 為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,找個介面使得這一子系統更加容易使用。
二、目的: 降低系統的複雜程度。
三、聯絡生活: 為什麼說它降低了系統的複雜程度呢。 比如我們假期做飯,自己做飯的話,我們需要菜,米,碗,筷,類之間互動關係是怎樣的,而如果我們在外面買飯又是怎樣的呢:
在飯店吃飯就設計到了一個模式——面板模式。對面板模式我的理解:把很多子類裝到一個袋子裡,只有一個口,這個口就是Facade外觀類,相當於飯店服務員,我們只需要告訴服務員想吃什麼,他們就可以給做出來,而不用我們和菜、米等之間互動。由此可見,通過面板模式,我們可以降低系統的耦合,類之間可以不必相互互動,而是通過一個外觀類實現A和B的訪問,大大降低了耦合性。
四、優缺點:
1、優點: 完美體現依賴倒轉和迪米特。 (1)面板模式對客戶屏蔽了子系統組件,從而簡化了介面,減少了客戶處理的對象數目並使子系統的使用更加簡單。 (2)它實現了子系統與客戶之間的松耦合關係,而子系統內部的功能組件是緊耦合的。松耦合使得子系統的組件變化不會影響到它的客戶。
2、缺點: 在物件導向軟體系統中,會用到很多類,面板模式的引入使得類之間的耦合性減低,但是如果想要引入更多的類,卻需要更改外觀類,這一點來看,面板模式是不符合開閉原則的,雖然他使其更改容易。
五、應用:
1、面板模式結構圖:
2、代碼展示: 先寫出四個子系統的類: 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() { Console.WriteLine("\n方法組合A()---"); one.MethodOne(); two.MethodTwo(); four.MethodFour(); } public void MethodB() { Console.WriteLine("\n方法組B()---"); two.MethodTwo(); three.MethodThree(); } } 用戶端調用: //由於Facade的作用,用戶端可以根本不知道三個子系統類的存在,代碼比較簡潔 static void Main(string[] args) { Facade facade = new Facade(); facade.MethodA(); facade.MethodB(); Console.Read(); }
3、何時使用。 設計初期:有意識的將不同的兩個層分離。
開發階段:子系統往往因為不斷地重構煙花而變得越來越複雜,大多數模式使用時都會產生很多很小的類,本是好事,但給外部調用他們的使用者程式帶來了使用上的困難,增加外觀FFacade可以提供一個簡單地額介面,減少他們之間的依賴。
維護:難以維護和擴充時,為新系統開發一個外觀Facade類,提供設計粗糙和高度複雜的遺留代碼的比較清晰簡單的介面,讓新系統與Facade對象互動,Facade與遺留代碼互動所有複雜的工作。
六、總結: 引入外觀類,通過將類封裝,實現了一個高層介面,降低了系統的複雜程度,這樣的實現方式非常類似適配器模式,然而面板模式與適配器模式不同的是:適配器模式是將一個對象封裝起來以改變其介面,而面板模式是將一群對象 ”封裝“起來以簡化其介面。但是大家不要忘了,如果引入一個新的子系統,我們需要修改子系統,這樣就不符合開閉原則了,所以每個模式都有它好的一面,也有它不好的一面。 最後我想問大家一個問題:簡單原廠模式不符合開閉原則,而面板模式也不符合,為何面板模式就可以歸入23種模式,而簡單工廠卻不行。如果說簡單原廠模式是因為Factory 方法模式已經將它的不足改正了,所以有Factory 方法模式就可以了,可是面板模式不符合開閉原則,歸入23種模式怎麼說通呢。 感謝和您的交流。