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

引言

在軟件測試中,通常都是在功能測試穩定的狀況下再進行UI自動化測試、或者進行性能測試。若是一個一個進行太麻煩,此時可使用對外提供一個簡單接口,經過這個接口能夠訪問內部一羣接口。例如進行UI自動化測試, 那麼執行功能測試後再執行自動化測試。在軟件開發過程當中,將對外提供了一個統一的接口,用來訪問子系統中的一羣接口的模式稱爲外觀模式。這種模式能夠應對客戶端程序與複雜系統的內部子系統進行耦合而致使客戶端程序隨着子系統的變化而變化,將複雜系統的內部子系統與客戶端之間的依賴解耦。設計模式

概念

外觀模式(Facade Pattern)是一種結構型設計模式, 能爲複雜系統、 程序庫或框架提供一個簡單 (但有限) 的接口。框架

外觀定義了一個高層接口,讓子系統更容易使用。使用外觀模式時,咱們建立了一個統一的類,用來包裝子系統中一個或多個複雜的類,客戶端能夠直接經過外觀類來調用內部子系統中方法,從而外觀模式讓客戶和子系統之間避免了緊耦合。性能

結構圖

角色

外觀角色(Facade):在客戶端能夠調用它的方法,在外觀角色中能夠知道相關的(一個或者多個)子系統的功能和責任;在正常狀況下,它將全部從客戶端發來的請求委派到相應的子系統去,傳遞給相應的子系統對象處理。
子系統角色(SubSystem Classes):在軟件系統中能夠有一個或者多個子系統角色,每個子系統能夠不是一個單獨的類,而是一個類的集合,它實現子系統的功能;每個子系統均可以被客戶端直接調用,或者被外觀角色調用,它處理由外觀類傳過來的請求;子系統並不知道外觀的存在,對於子系統而言,外觀角色僅僅是另一個客戶端而已。測試

實現

例如咱們實現引言中提到的手動測試、自動化測試、性能測試。spa

using System;


namespace Facade { class Program { /// <summary> /// 若是不使用外觀模式,則須要調用三次測試執行 /// 此時客戶端只須要調用外觀類中的方法就能夠了,簡化了客戶端的操做 /// </summary> /// <param name="args"></param> static void Main(string[] args) { StartTest test = new StartTest(); test.start(); Console.Read(); } } /// <summary> /// 外觀類,開始測試 /// </summary> public class StartTest { private ManuaTest manua; private AutoTest auto; private StressTest stress; public StartTest() { manua = new ManuaTest(); auto = new AutoTest(); stress = new StressTest(); } public void start() { manua.test(); auto.test(); stress.test(); } } /// <summary> /// 子系統類A,手工測試 /// </summary> public class ManuaTest { public void test() { Console.WriteLine("執行手工測試"); } } /// <summary> /// 子系統類B,自動化測試 /// </summary> public class AutoTest { public void test() { Console.WriteLine("執行自動化測試"); } } /// <summary> /// 子系統類C,壓力測試 /// </summary> public class StressTest { public void test() { Console.WriteLine("執行壓力測試"); } } }

運行結果設計

執行手工測試
執行自動化測試
執行壓力測試

優缺點

優勢

  • 外觀模式下降了客戶端對子系統使用的複雜性。一個子系統的修改對其餘子系統沒有任何影響,並且子系統內部變化也不會影響到外觀對象。
  • 外觀模式鬆散了客戶端與子系統的耦合關係,讓子系統內部的模塊能更容易擴展和維護。
  • 經過合理使用外觀模式,能夠幫助咱們更好的劃分訪問的層次。

 缺點  

  • 不能很好地限制客戶端直接使用子系統類,若是對客戶端訪問子系統類作太多的限制則減小了可變性和靈活 性。
  • 若是設計不當,增長新的子系統可能須要修改外觀類的源代碼,違背了開閉原則。

適用場景

  • 當要爲訪問一系列複雜的子系統提供一個簡單入口時可使用外觀模式。
  • 客戶端程序與多個子系統之間存在很大的依賴性。引入外觀類能夠將子系統與客戶端解耦,從而提升子系統的獨立性和可移植性。
  • 在層次化結構中,可使用外觀模式定義系統中每一層的入口,層與層之間不直接產生聯繫,而經過外觀類創建聯繫,下降層之間的耦合度。
相關文章
相關標籤/搜索