1. 外觀模式簡介
外觀模式主要解決的問題:當有多個類要處理時,需要一個個類去呼叫,沒有複用性和擴充套件性。外觀模式將處理子類的過程封裝成操作,簡化客戶端的呼叫過程。
1.1 定義
外觀模式(Facade)通過提供一個統一介面,來訪問子系統的多個介面。
使用外觀模式時,建立一個統一的類,用來包裝子系統中一個或多個複雜的類,客戶端可以直接通過外觀類來呼叫內部子系統中方法。
外觀模式讓客戶端與子系統之間避免緊耦合。
1.2 使用頻率
高
2. 外觀模式結構
2.1 結構圖
2.2>、參與者
外觀模式參與者:
◊ Facade
° 知道哪些子系統類負責處理請求
° 將客戶的請求代理給相應的子系統物件
◊ Subsystem Classes
° 實現子系統的功能
° 處理由Facade物件指派的任務來協調子系統下各子類的呼叫方式
在外觀模式中,外觀類Facade的方法OptionWrapper實現的就是以不同的次序呼叫下面類SubSystem1、SubSystem2的方法Operation,通過不同的Operation組合實現裝飾功能。
3、外觀模式結構實現
SubSystemOne.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.FacadePattern.Structural { public class SubSystemOne { public void MethodOne() { Console.WriteLine(" SubSystemOne Method"); } } }
SubSystemTwo.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.FacadePattern.Structural { public class SubSystemTwo { public void MethodTwo() { Console.WriteLine(" SubSystemTwo Method"); } } }
SubSystemThree.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.FacadePattern.Structural { public class SubSystemThree { public void MethodThree() { Console.WriteLine(" SubSystemThree Method"); } } }
SubSystemFour.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.FacadePattern.Structural { public class SubSystemFour { public void MethodFour() { Console.WriteLine(" SubSystemFour Method"); } } }
Facade.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.FacadePattern.Structural { public class Facade { private SubSystemOne _one; private SubSystemTwo _two; private SubSystemThree _three; private SubSystemFour _four; public Facade() { _one = new SubSystemOne(); _two = new SubSystemTwo(); _three = new SubSystemThree(); _four = new SubSystemFour(); } public void MethodA() { Console.WriteLine("\nMethodA() ---- "); _one.MethodOne(); _two.MethodTwo(); _four.MethodFour(); } public void MethodB() { Console.WriteLine("\nMethodB() ---- "); _two.MethodTwo(); _three.MethodThree(); } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DesignPatterns.FacadePattern.Structural; namespace DesignPatterns.FacadePattern { class Program { static void Main(string[] args) { Facade facade = new Facade(); facade.MethodA(); facade.MethodB(); } } }
執行輸出:
MethodA() ---- SubSystemOne Method SubSystemTwo Method SubSystemFour Method MethodB() ---- SubSystemTwo Method SubSystemThree Method 請按任意鍵繼續. . .
4、外觀模式應用分析
外觀模式適用情形:
◊ 當要為一個複雜子系統提供一個簡單介面時,子系統往往因為不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類,這使得子系統更具可用性,也更容易對子系統進行定製。但這也給那些不需要定製子系統的使用者帶來一些使用上的困難。外觀模式可以提供一個簡單的預設檢視。這一檢視對大多數使用者來說已經足夠,而那些需要更多定製性的使用者可以越過Facade層。
◊ 客戶程式與抽象類的實現部分之間存在著很大的依賴性。引入外觀模式將這個子系統與客戶以及其他子系統分離,可以提高該子系統的獨立性和可移植性。
◊ 當需要構建有層次結構的子系統時,使用外觀模式定義每層的入口點。如果子系統間相互依賴,它們只需通過外觀進行通訊,從而簡化它們之間的依賴關係,
外觀模式特點:
◊ 它實現了子系統對客戶的遮蔽,因而減少了客戶處理的物件數目並且使子系統使用起來更加方便。
◊ 它實現了子系統與客戶之間的鬆耦合關係。而子系統內部的功能元件往往是緊耦合的。鬆耦合關係使得子系統的元件變化不會影響到它的客戶。
◊ 外觀模式有助於建立系統的層次結構,也有助於對物件之間的依賴關係分層。
◊ 外觀模式可以消除複雜的迴圈依賴關係。這一點在客戶程式與子系統是分別實現的時候尤為重要。在大型軟體系統中降低編譯依賴性至關重要。在子系統類改變時,希望儘量減少重編譯工作以節省時間。
◊ 用外觀模式可以降低編譯依賴性,減少對重要系統做較小的改變所需的重編譯工作。
◊ 外觀模式有利於簡化系統在不同平臺之間的移植過程。因為編譯一個子系統一般不需要編譯所有其他子系統。
◊ 如果應用需要,外觀模式並不限制子系統類的使用。因此可以在系統易用性和通用性之間加以選擇。