外觀模式(Facade Pattern):外部與一個子系統的通訊必須經過一個統一的外觀對象進行,爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。外觀模式又稱爲門面模式,它是一種對象結構型模式。spa
根據「單一職責原則」,在軟件中將一個系統劃分爲若干個子系統有利於下降整個系統的複雜性,一個常見的設計目標是使子系統間的通訊和相互依賴關係達到最小,而達到該目標的途徑之一就是引入一個外觀對象,它爲子系統的訪問提供了一個簡單而單一的入口。 -外觀模式也是「迪米特法則」的體現,經過引入一個新的外觀類能夠下降原有系統的複雜度,同時下降客戶類與子系統類的耦合度。 - 外觀模式要求一個子系統的外部與其內部的通訊經過一個統一的外觀對象進行,外觀類將客戶端與子系統的內部複雜性分隔開,使得客戶端只須要與外觀對象打交道,而不須要與子系統內部的不少對象打交道。 -外觀模式的目的在於下降系統的複雜程度。 -外觀模式從很大程度上提升了客戶端使用的便捷性,使得客戶端無須關心子系統的工做細節,經過外觀角色便可調用相關功能。設計
外觀模式包含以下角色:code
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 }