Facade(门面模式)
一、门面模式定义
外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。举个例子:在做项目或产品的过程中进行跨部门合作的时候,每个部门都有个相应的接口人,那么我们只需和对应部门的接口人交互即可,门面模式也一样,门面模式提供一个高层次的接口,使得子系统更易于使用。
二、 门面模式的结构
门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
三、特点
子系统的独立性: 子系统对外提供一个统一简单的接口,可以减少系统间的耦合性,提高子系统的独立性和可移植性。
系统的层次性:在构建一个层次化的系统时,可以使用 Facade 模式定义系统中每一层的入口。如果层与层之间是相互依赖的,则可以限定它们仅通过 Facade 进行通信,从而简化层与层之间的依赖关系
假设有一个保安系统,由2个camera,3个light,1个sensor,1个alarm组成。保安系统的客户端,即工作人员需要将这些仪器打开或者关闭。
如果不适用Facade模式,代码为:
public class Client
{
static private Camera camera1,camera2;
static private Light light1,light2,light3;
static private Sensor sensor;
static private Alarm alarm;
public static void main(String[] args)
{
camera1.turnOn();
camera2.turnOn();
light1.turnOn();
light2.turnOn();
light3.turnOn();
sensor.activate();
alarm.activate();
}
}
如果使用了Facade模式,代码为:
public class Facade
{
private Camera camera1,camera2;
private Light light1,light2,light3;
private Sensor sensor;
private Alarm alarm;
public void active()
{
camera1.turnOn();
camera2.turnOn();
light1.turnOn();
light2.turnOn();
light3.turnOn();
sensor.activate();
alarm.activate();
}
}
public class Client
{
private static Facade facade;
public static void main(String[] args)
{
facade.active();
}
}
客户端代码少了很多
四、总结
从客户程序的角度来看, Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Fa?ade接口的变化。
Fa?ade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Fa?ade很多时候更是一种架构设计模式。
注意区分Fa?ade模式、Adapter模式、Bridge模式与Decorator模式。Fa?ade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。
注意门面模式不能破坏软件的单一原则.聚合一组相关的功能!