外觀模式(Facade Pattern):外部與一個子系統的通訊必須經過一個統一的外觀對象進行,爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。外觀模式又稱爲門面模式,它是一種對象結構型模式。git
Facade類:github
namespace FacadePattern.BasicStructure { /// <summary> /// 外觀類 /// </summary> class Facade { private SubSystemOne _subSystemOne; private SubSystemTwo _subSystemTwo; private SubSystemThree _subSystemThree; private SubSystemFour _subSystemFour; public Facade() { _subSystemOne = new SubSystemOne(); _subSystemTwo = new SubSystemTwo(); _subSystemThree = new SubSystemThree(); _subSystemFour = new SubSystemFour(); } public void MethodA() { Console.WriteLine("\n方法組A() ---"); _subSystemOne.Method(); _subSystemTwo.Method(); _subSystemFour.Method(); } public void MethodB() { Console.WriteLine("\n方法組B() ---"); _subSystemTwo.Method(); _subSystemThree.Method(); } } }
SubSystemOne類:spa
namespace FacadePattern.BasicStructure { /// <summary> /// 子系統一 /// </summary> class SubSystemOne { public void Method() { Console.WriteLine("子系統一的方法"); } } }
SubSystemTwo類:代理
namespace FacadePattern.BasicStructure { /// <summary> /// 子系統二 /// </summary> class SubSystemTwo { public void Method() { Console.WriteLine("子系統二的方法"); } } }
SubSystemThree類:code
namespace FacadePattern.BasicStructure { /// <summary> /// 子系統三 /// </summary> class SubSystemThree { public void Method() { Console.WriteLine("子系統三的方法"); } } }
SubSystemFour類:對象
namespace FacadePattern.BasicStructure { /// <summary> /// 子系統四 /// </summary> class SubSystemFour { public void Method() { Console.WriteLine("子系統四的方法"); } } }
客戶端調用代碼:blog
static void Main(string[] args) { try { {//BasicStructure //因爲Facade的做用,客戶端根本不知道子4個子系統的存在 Facade facade = new Facade(); facade.MethodA(); facade.MethodB(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
結果以下:接口
場景模擬:本人天天都要給筆記本電腦開機關機,接下來就用外觀模式來模擬下。get
NotebookPowerSupply(筆記本電源)類——Facade類string
namespace FacadePattern.SituationSimulation { /// <summary> /// 筆記本電腦電源鍵--至關於外觀類 /// </summary> class NotebookPowerSupply { private OpenPowerSupply _openPowerSupply; private ClosePowerSupply _closePowerSupply; public NotebookPowerSupply() { _openPowerSupply = new OpenPowerSupply(); _closePowerSupply = new ClosePowerSupply(); } public void Open() { Console.WriteLine("\n--開啓電源方法"); _openPowerSupply.Operation(); } public void Close() { Console.WriteLine("\n--關閉電源方法"); _closePowerSupply.Operation(); } } }
OpenPowerSupply(開啓電源)類——SubSystem類
namespace FacadePattern.SituationSimulation { /// <summary> /// 打開電源 /// </summary> class OpenPowerSupply { public void Operation() { Console.WriteLine("打開電源"); } } }
ClosePowerSupply(關閉電源)類——SubSystem類
namespace FacadePattern.SituationSimulation { /// <summary> /// 關閉電源 /// </summary> class ClosePowerSupply { public void Operation() { Console.WriteLine("關閉電源"); } } }
客戶端調用代碼:
static void Main(string[] args) { try { {//SituationSimulation NotebookPowerSupply notebookPowerSupply = new NotebookPowerSupply(); notebookPowerSupply.Open(); notebookPowerSupply.Close(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
結果以下:
外觀模式的優勢
外觀模式的缺點
在如下狀況下可使用外觀模式: