Facade门面模式

来源:互联网 发布:贪心算法举例 编辑:程序博客网 时间:2024/05/11 13:17
一、门面模式定义 

      外部与一个子系统的通信必须通过一个统一的门面(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模式注重稳定接口的前提下为对象扩展功能。 

注意门面模式不能破坏软件的单一原则.聚合一组相关的功能!


Façade模式的几个要点:

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

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


特性使用案例(与序列化序列号变化1L,2L)

读者应该听过 Façade 模式,它是为应用程序提供统一的访问接口,案例程序中的 Client 客户端使用了该模式,案例程序结构图如图 1 所示。


图 1. 案例程序结构
图 1. 案例程序结构 

Client 端通过 Façade Object 才可以与业务逻辑对象进行交互。而客户端的 Façade Object 不能直接由 Client 生成,而是需要 Server 端生成,然后序列化后通过网络将二进制对象数据传给 Client,Client 负责反序列化得到 Façade 对象。该模式可以使得 Client 端程序的使用需要服务器端的许可,同时 Client 端和服务器端的 Façade Object 类需要保持一致。当服务器端想要进行版本更新时,只要将服务器端的 Façade Object 类的序列化 ID 再次生成,当 Client 端反序列化 Façade Object 就会失败,也就是强制 Client 端从服务器端获取最新程序。