外观模式-Facade

外观模式

假设我们需要开发一个坦克模拟系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎、控制器、车轮、车身等各子系统构成。

动机

组件的客户(即外部接口,或客户程序)和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。

如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?

意图

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

结构

Facade.png

要点

  • 从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。

  • Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。

    代码示例

  • 接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public interface Wheel
    {
    void WActon1();
    void WAction2();
    }
    public interface Engine
    {
    void EAction1();
    void EAction2();
    }
    public interface Controller
    {
    void CAction1();
    void CAction2();
    }
  • Facade

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Facade
    {
    Wheel[] wheels = WheelFactory.GetWheel(4);
    Engine[] engines = EngineFactory.GetEngine(2);
    Controller controller = Controller.GetController(1);
    public void Run()
    {
    wheels[0].WAction1();
    //..
    }
    public void Stop()
    {
    wheels[0].SAction1();
    //..
    }
    }
  • Client

    1
    2
    3
    4
    //不必关心Wheel和Engine等的具体实现,只需关注Facade
    Facade facade = new Facade();
    facade.Run();
    facade.Stop();