上述A方案的問題在於組件的客戶和組件中各種複雜的子系統有了過多的耦合,隨著外部客戶程式和各子系統的演化,這種過多的耦合面臨很多變化的挑戰。
如何簡化外部客戶程式和系統間的互動介面?如何將外部客戶程式的演化和內部子系統的變化之間的依賴相互解耦?
意圖:
為子系統中的一組介面提供一個一致的介面,Façade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
using System;
internal class Wheel
{
public void WAction1() { }
public void WAction2() { }
}
internal class Engine
{
public void EAction1() { }
public void EAction2() { }
}
internal class Bodywork
{
public void BAction1() { }
public void BAction2() { }
}
internal class Controller
{
public void CAction1() { }
public void CAction2() { }
}
public class TankFacade
{
Wheel[] wheels = new Wheel[4];
Engine[] engines = new Engine[4];
Bodywork bodywork = new Bodywork();
Controller controller = new Controller();
public void Start() { }
public void Stop() { }
public void Run() { }
public void Shot() { }
}
要點:
1、從客戶程式的角度來看,Facade模式不僅簡化了整個組件系統的介面,同時對於組件內部與外部客戶程式來說,從某種程度上也達到了一種“解耦”的效果——內部子系統的任何變化不會影響到Façade介面的變化;
2、Fa
c
ade設計模式並非一個集裝箱,可以任意地放進任何多個對象。Facade模式中組件的內部應該是“相互耦合關係比較大的一系列組件”,而不是一個簡單的功能集合;
3、注意區分Facade模式、Adapter模式、Bridge模式與Decorator模式。
Facade模式注重簡化介面,
Adapter模式注重轉換介面,
Bridge模式注重分離介面(抽象)與其實現,
Decorator模式注重穩定介面的前提下為對象擴充功能。
適用性:
1、為一個複雜子系統提供一個簡單介面;
2、提高子系統的獨立性;
3、在層次化結構中,可以使用Facade模式定義系統中每一層的入口。