動機:有些系統組件的客戶和組件中各類複雜的子系統有了過多的的耦合,隨着外部客戶程序
和個子系統的演化,這種過多的耦合面臨不少變化的挑戰;如何簡化外部客戶程序和系統的交互接口?
如何將外部客戶程序的演化和內部子系統的變化之間的依賴相互解耦
意圖:爲子系統的一組接口提供一個一致的界面,Facade模式定義了了一個高層接口,這個接口使得這一子系統更加
容易使用spa
可適用性:
一、當你要爲一個複雜子系統提供一個簡單接口時。子系統每每由於不斷演化而變得愈來愈複雜。大多數模式使用時都會
產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不須要定製子系統的用
戶帶來一些使用上的困難。Facade能夠提供一個簡單的缺省視圖,這一視圖對大多數用戶來講已經足夠,而那
些須要更多的可定製性的用戶能夠越過Facade層。
二、客戶程序與抽象類的實現部分之間存在着很大的依賴性。引入Facade將這個子系統與客戶以及其餘的子系統
分離,能夠提升子系統的獨立性和可移植性。
三、當你須要構建一個層次結構的子系統時,使用Facade模式定義子系統中每層的入口點。若是子系統之間是相
互依賴的,你可讓它們僅經過Facade進行通信,從而簡化了它們之間的依賴關係。設計
UML圖解:對象
示例:假設咱們須要開發一個坦克模擬系統用於模擬坦克車在各類做戰環境中的行爲,其中坦克系統由引擎、控制器、車輪、車身等各類子系統構成。blog
代碼以下:接口
namespace Facade { /// <summary> /// 車輪 /// </summary> public class Wheel { public void WAction1() { } public void WAction2() { } } /// <summary> /// 引擎 /// </summary> public class Engine { public void EAction1() { } public void EAction2() { } } /// <summary> /// 控制器 /// </summary> public class Controler { public void CAction1() { } public void CAction2() { } } /// <summary> /// 車身 /// </summary> public class Bodywork { public void BAction1() { } public void BAction2() { } } /*假設將以上每一個類看作是各個子系統的話,下面就用Facade模式設計一個高層的系統*/ /// <summary> /// 設計好TankFacade類,這樣就能夠將系統解耦,咱們使用坦克時並不須要關注其引擎、控制器、車輪、 /// 車身具體怎麼工做的咱們只須要知道坦克能作什麼就能夠,TankFacade類簡化了客戶程序使用的複雜性 /// ,也同時隱藏了子系的內部實現,以對象組合的方式來達到解耦的目的;雖然子系統和TankFacade同在 /// 一個DLL裏,但客戶程 序只能透過TankFacade類來使用各個子系統的功能 /// </summary> public class TankFacade { Wheel[] wheels=new Wheel[4]; Engine[] engines = new Engine[4]; Bodywork body = new Bodywork(); Controler control = new Controler(); public void Start() { //使用子系統Engine的某些方法... } public void Run() { //使用子系統Wheel的某些方法... } public void Shot() { //.... } public void Stop() { //.... } } }