1、系統的複雜度
1)假設咱們須要開發一個坦克模擬系統用於模擬坦克車在各類做戰環境中的行爲,其中坦克系統由引擎、控制器、車輪、車身等各子系統構成。
//車輪
public class Wheel
{
public void WAction1(){......}
public void WAction2(){......}
}
//引擎
public class Engine
{
public void EAction1(){......}
public void EAction2(){......}
}
//車身
public class Bodywork
{
public void BAction1(){......}
public void BAction2(){......}
}
//控制器
public class Controller
{
public void CAction1(){......}
public void CAction2(){......}
}設計模式
2)如何使用這樣的系統
A方案:各類做戰環境(外部接口)與坦克車子系統直接交互,是個緊耦合。
B方案:各類做戰環境(外部接口)與一個Facade交互,Facade與坦克車子系統交互。外部接口與子系統沒有耦合關係。
2、動機(Motivation)
1)上述A方案的問題在於組件的客戶和組件中各類複雜的子系統有了過多的耦合,隨着外部客戶程序和各子系統的演化,這種過多的耦合面臨不少變化的挑戰。
2)如何簡化外部客戶程序和系統間的交互接口?如何將外部客戶程序的演化和內部子系統的變化之間的依賴相互解耦?
3、意圖(Intent)
爲子系統的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
——《設計模式》GoF
4、實例:坦克模擬系統
//車輪
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
{
//這裏能夠應用工廠等模式,好比要換引擎,換車身什麼的
//Facade模式仍是優先使用了組合
//好比有四個輪子和一條履帶
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()
{
}
}設計
5、Facade模式的幾個要點
1)從客戶程序的角度來看,Facade模式不公簡化了整個組件系統的接口,同時對於組件內部與外部客戶程序來講,從某種程度上也達到了一種「解耦」的效果——內部子系統的任何變化不會影響到Facade接口的變化。
2)Facade設計模式更注重從架構的層次去看整個系統,而不是單個類的層次。Facade不少時候更是一種架構設計模式。
3)注意區分Facade模式、Adapter模式、Bridge模式、Decorator模式。Facade模式注重簡化接口,Adapter模式注重轉換接口,Bridge模式注重分離接口(抽象)與其實現,Decorator模式注重穩定接口的前提下爲對象擴展功能。對象