设计模式-门面模式

2,375 阅读2分钟

# 七大软件设计原则
# 设计模式-工厂模式
# 设计模式-单例模式
# 设计模式-原型模式
# 设计模式-策略模式
# 设计模式-责任链模式
# 设计模式-建造者模式
# 设计模式-深度分析代理模式

门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。

其实门面系统很简单,甚至我们在开发的时候也是一直在用,比如MVC,所有的service层就相当于很多个子系统,所有的Controller层就像是一个门面,客户端调用Controller来实现功能,再比如所有的dao层是很多个子系统,那么此时所有service其实也就是门面。就那么简单,只是我们在平时开发的过程中没有感知而已

门面模式通用UML类图

image.png 主要角色有:

  1. 外观角色(Facade):也称门面角色,系统对外的统一接口
  2. 子系统角色(SubSystem):可以同时有一个或者多个SubSystem,SubSystem并不知道Facade的存在,Facade对于SubSystem而言仅仅只是一个客户端

通用代码示例

public class Facade {
    private final SystemA systemA = new SystemA();
    private final SystemB systemB = new SystemB();
    private final SystemC systemC = new SystemC();
    public void doSomething() {
        systemA.doSomething();
        systemB.doSomething();
        systemC.doSomething();
    }
}
public class SystemA {
    public void doSomething() {
        System.out.println("调用A系统");
    }
}
public class SystemB {
    public void doSomething() {
        System.out.println("调用B系统");
    }
}
public class SystemC {
    public void doSomething() {
        System.out.println("调用C系统");
    }
}
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.doSomething();
    }
}

门面模式在源码中的应用

我们可以看一下tomcat源码中的RequestFacadeimage.png 发现其实就是对Request的封装,其中Request就是对应的子系统

门面模式应用场景

  1. 对分层结构系统构建时,使用门面模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  2. 当一个复杂系统的子系统很多时,外门面模式可以为系统设计一个简单的接口供外界访问
  3. 当客户端与多个子系统之间存在很大的联系时,引入门面模式可将它们分离,从而提高子系统的独立性和可移植性

门面模式优缺点

优点:

  1. 简化了调用过程,无需深入了解子系统
  2. 减少系统依赖
  3. 更好的划分层次
  4. 遵循迪米特法则

缺点:

  1. 不符合开闭原则
  2. 有可能出现违背单一职责原则

门面模式和代理模式的区别

可以说门面模式是特殊的静态代理模式
最大的区别在于代理模式注重于方法的增强而门面模式则是方法的封装