設計模式之☞外觀模式

簡介

  外觀模式(Facade Pattern):外部與一個子系統的通訊必須經過一個統一的外觀對象進行,爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。外觀模式又稱爲門面模式,它是一種對象結構型模式。spa

模式分析

  根據「單一職責原則」,在軟件中將一個系統劃分爲若干個子系統有利於下降整個系統的複雜性,一個常見的設計目標是使子系統間的通訊和相互依賴關係達到最小,而達到該目標的途徑之一就是引入一個外觀對象,它爲子系統的訪問提供了一個簡單而單一的入口。 -外觀模式也是「迪米特法則」的體現,經過引入一個新的外觀類能夠下降原有系統的複雜度,同時下降客戶類與子系統類的耦合度。 - 外觀模式要求一個子系統的外部與其內部的通訊經過一個統一的外觀對象進行,外觀類將客戶端與子系統的內部複雜性分隔開,使得客戶端只須要與外觀對象打交道,而不須要與子系統內部的不少對象打交道。 -外觀模式的目的在於下降系統的複雜程度。 -外觀模式從很大程度上提升了客戶端使用的便捷性,使得客戶端無須關心子系統的工做細節,經過外觀角色便可調用相關功能。設計

優勢

  • 對客戶屏蔽子系統組件,減小了客戶處理的對象數目並使得子系統使用起來更加容易。經過引入外觀模式,客戶代碼將變得很簡單,與之關聯的對象也不多。
  • 實現了子系統與客戶之間的鬆耦合關係,這使得子系統的組件變化不會影響到調用它的客戶類,只須要調整外觀類便可。
  • 下降了大型軟件系統中的編譯依賴性,並簡化了系統在不一樣平臺之間的移植過程,由於編譯一個子系統通常不須要編譯全部其餘的子系統。一個子系統的修改對其餘子系統沒有任何影響,並且子系統內部變化也不會影響到外觀對象。
  • 只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類。

缺點

  • 不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性。
  • 在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。

用途

  • 當要爲一個複雜子系統提供一個簡單接口時可使用外觀模式。該接口能夠知足大多數用戶的需求,並且用戶也能夠越過外觀類直接訪問子系統。
  • 客戶程序與多個子系統之間存在很大的依賴性。引入外觀類將子系統與客戶以及其餘子系統解耦,能夠提升子系統的獨立性和可移植性。
  • 在層次化結構中,可使用外觀模式定義系統中每一層的入口,層與層之間不直接產生聯繫,而經過外觀類創建聯繫,下降層之間的耦合度。

模式結構圖

外觀模式包含以下角色:code

  • Facade: 外觀角色
  • SubSystem:子系統角色

 時序圖

 代碼實現

建立接口:

Facade.cs對象

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public interface Facade
10     {
11         void speak();
12     }
13 }

接口實現類:

SystemA.cs、SystemB.cs、SystemC.csblog

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public class SystemA:Facade
10     {
11 
12         public void speak()
13         {
14             Console.WriteLine("我是系統A");
15         }
16     }
17 }
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public class SystemB : Facade
10     {
11         public void speak()
12         {
13             Console.WriteLine("我是系統B");
14         }
15     }
16 }
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public class SystemC : Facade
10     {
11         public void speak()
12         {
13             Console.WriteLine("我是系統C");
14         }
15     }
16 }

建立外觀類:

ShapeMaker.cs接口

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     public class ShapeMaker
10     {
11         private Facade systemA;
12         private Facade systemB;
13         private Facade systemC;
14         public ShapeMaker()
15         {
16             systemA = new SystemA();
17             systemB = new SystemB();
18             systemC = new SystemC();
19         }
20         public void operationA()
21         {
22             systemA.speak();
23         }
24         public void operationB()
25         {
26             systemB.speak();
27         }
28         public void operationC()
29         {
30             systemC.speak();
31         }
32     }
33 }

控制檯實現:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace Facade
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             ShapeMaker shapeMaker = new ShapeMaker();
14             shapeMaker.operationA();
15             shapeMaker.operationB();
16             shapeMaker.operationC();
17             Console.ReadKey();
18         }
19     }
20 }

效果:

相關文章
相關標籤/搜索