Facade模式的几个要点
从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。
Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。
模式结构
Facade
° 知道哪些子系统类负责处理请求
° 将客户的请求代理给相应的子系统对象
Subsystem Classes
° 实现子系统的功能
° 处理由Facade对象指派的任务来协调子系统下各子类的调用方式
在外观模式中,外观类Facade的方法OptionWrapper实现的就是以不同的次序调用下面类SubSystem1、SubSystem2的方法Operation,通过不同的Operation组合实现装饰功能。
模式图例
假设我们需要开发一个坦克模拟系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎、控制器、车轮、车身等各子系统构成。
代码
public class BodyWork
{
public void BAction()
{
Console.WriteLine("车身");
}
}
public class Controller
{
public void CAction()
{
Console.WriteLine("车身");
}
}
public class Enigine
{
public void EAction()
{
Console.WriteLine("引擎");
}
}
public class Wheel
{
public void WAction()
{
Console.WriteLine("车轮");
}
}
public class Tank
{
private BodyWork _bodyWork;
private Enigine _enigine;
private Controller _controller;
private Wheel _wheel;
public Tank()
{
_bodyWork = new BodyWork();
_enigine = new Enigine();
_controller = new Controller();
_wheel = new Wheel();
}
public void MethodA()
{
_bodyWork.BAction();
_enigine.EAction();
_controller.CAction();
_wheel.WAction();
}
}