/*
* 案例場景:
* 遊戲中需要開發一個坦克,該坦克在各種作戰環境中使用【具有不同的行爲】,其中,坦克有引擎、控制器、車身、車輪等組成。
* 在某些中作戰環境,可能和坦克的引擎、控制器關聯,而在另外一種作戰環境下,可能可坦克的車輪和車身關聯。也就是所,
* 外部環境和坦克內部部件直接耦合,耦合度緊密。
*
* Facade模式:爲坦克所有部件提供一個統一的接口,外部環境直接調用統一接口,從而實現統一處理。
*
* 問題分析:
* 組件的客戶[外部環境]和組件[坦克]中複雜子系統的過多耦合,隨着外部客戶程序【外部環境】和子系統【坦克部件】的演變,
* 這種過多的耦合面臨很多變化挑戰【內外需要兼顧,才能完成修改;外部環境修改,必須瞭解內部結構】。
*
* Facade模式簡單,應用廣泛。
*
* 意圖:
* 爲子系統的一組接口提供一個一致的界面。
* Facade模式定義
*
*/
internal class Engine //internal表示爲內部類,不對外開放。
{
public void EAction1()
{
}
public void EAction2()
{
}
}
internal class Controler
{
public void CAction1()
{
}
public void CAction2()
{
}
}
internal class BodyWork
{
public void BWAction1()
{
}
public void BWAction2()
{
}
}
internal class Wheel
{
public void WAction1()
{
}
public void WAction2()
{
}
}
internal class Weapen
{
public void WAction1()
{
}
public void WAction2()
{
}
}
//外觀
public class TankFacade
{
Wheel[] wheels = new Wheel[4];
BodyWork bodyWork = new BodyWork();
Engine[] engines = new Engine[4];
Controler controler = new Controler();
Weapen weapen = new Weapen();
public void Start()
{
//只和引擎,控制器,車輪,車身相關
}
public void Shot()
{
//只和引擎,控制器,武器相關
}
public void Stop()
{
//只和引擎,控制器,車輪,車身相關
}
public void Run()
{
//只和引擎,控制器,車輪,車身相關
}
}
/*Facade模式:
* 不僅簡化了整個組件系統的接口,同時,對於組件內部和外部程序來說,從某種程度上也達到一種“解耦”的效果。
* Facade設計模式更注重從架構層次上去看整個系統,而不是單個類的層次。
*
* 模式比較:
* Facade:注重“簡化接口”,或者說提供統一接口。【注意類的單一職責】
* Adapter:注重“轉換接口”,現存對象適配到新的環境中。
* Bridge:注重分離接口(抽象)與實現,使得他們可以獨立的變化。如:坦克兩個維度變化的分離。
* Decorator:注重“穩定接口”前提下,爲對象擴展功能。如:不同型號下,功能的擴展,避免了子類的膨脹。
*/
class Facade
{
public static void Main()
{
TankFacade tank = new TankFacade();
tank.Shot();
tank.Run();
/*
* 由此,外部調用坦克工作時,如啓動,射擊,都不和坦克的內部部件相關聯,很好的封裝了內部細節。
*
*/
}
}