门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。
其实门面系统很简单,甚至我们在开发的时候也是一直在用,比如MVC,所有的service层就相当于很多个子系统,所有的Controller层就像是一个门面,客户端调用Controller来实现功能,再比如所有的dao层是很多个子系统,那么此时所有service其实也就是门面。就那么简单,只是我们在平时开发的过程中没有感知而已
门面模式通用UML类图
主要角色有:
通用代码示例
- 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源码中的RequestFacade
类
发现其实就是对Request
的封装,其中Request
就是对应的子系统
门面模式应用场景
门面模式优缺点
优点:
缺点:
门面模式和代理模式的区别
可以说门面模式是特殊的静态代理模式
最大的区别在于代理模式注重于方法的增强而门面模式则是方法的封装