/*
* 案例场景:
* 游戏中需要开发一个坦克,该坦克在各种作战环境中使用【具有不同的行为】,其中,坦克有引擎、控制器、车身、车轮等组成。
* 在某些中作战环境,可能和坦克的引擎、控制器关联,而在另外一种作战环境下,可能可坦克的车轮和车身关联。也就是所,
* 外部环境和坦克内部部件直接耦合,耦合度紧密。
*
* 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();
/*
* 由此,外部调用坦克工作时,如启动,射击,都不和坦克的内部部件相关联,很好的封装了内部细节。
*
*/
}
}