1.概述

门面模式(Facade Pattern)又叫做外观模式,它通过为子系统提供一个统一的高层入口的方式,达到简化复杂系统的使用以及降低客户端与子系统之间的耦合度的效果,是一种很常用的设计模式。

2.门面模式的定义

看一下门面模式的官方定义:

翻译过来就是说,门面模式提供一个上层的接口,对子系统中的多个接口做一个统一的入口,让子系统能够更容易被使用。
也就是说,如果你曾经对复杂的方法做过一定的封装,对客户端提供一个调用更简单的高层接口(或方法),那么你就已经使用过门面模式了。

门面模式是迪米特法则的一种实践方式,所谓的迪米特法则也叫最少知道原则,简单的说就是客户端只需要知道服务端的功能以及如何调用即可(门面接口),而不需要知道服务端的底层实现(子系统),类图如下:
【设计模式】使用门面模式简化接口的复杂度-LMLPHP

这里需要解释一下子系统的概念,在门面模式中的子系统既可以是一个完整的系统,又可以是一定模块或者接口、类的组合,是一种抽象的概念。

下面用代码来定义,两个功能A和B,在一个完整的业务流程中需要先调用A再调用B,每个客户端都需要这么去调用,于是提供一个门面接口对A和B做一下封装。

  • 业务功能
public class ClassA {
    public void doSomething() {
        System.out.println("ClassA do something");
    }
}

public class ClassB {
    public void doSomething() {
        System.out.println("ClassB do something");
    }
}
  • 门面
public class Facade {

    private ClassA classA;
    private ClassB classB;

    public Facade() {
        classA = new ClassA();
        classB = new ClassB();
    }

    public void doSomething() {
        classA.doSomething();
        classB.doSomething();
    }
}

以上就是门面模式的定义,非常简单。

3.门面模式的应用场景

上面已经提到了,门面模式的作用主要就是封装复杂度,对外提供更简单易用的接口。
同时它还能带来一些 “副产品”,例如上述的A和B都是通过RPC来调用的,通过门面的方式,可以减少一次网络通信,从而提高调用的性能。

接下来就针对门面模式的作用,列举一些应用场景:

  • 简化复杂系统,封装业务流程:
    在大型、复杂的系统设计中,子系统可能包含许多类和对象,直接调用这些子系统的客户端代码会变得非常复杂。使用门面模式提供统一的接口,将内部子系统的复杂性隐藏起来,使得客户端可以更加简单、直观地与系统进行交互。
    如订单处理、用户注册登录等。通过门面模式,可以将这一系列的操作步骤封装成一个简洁的接口,方便业务逻辑的统一管理和执行。
  • 减少模块间的耦合度:
    通过统一的访问点来代理对各个子系统的访问,减少客户端与各个子系统的直接耦合。当子系统内部代码发生变化时,只要保持门面接口不变,就不会影响到已经使用此接口的客户端程序。
  • 跨平台和跨系统集成:
    在系统集成项目或者跨平台开发中,门面模式被广泛应用来作为不同系统或平台之间的适配层,它将各子系统的接口转换为统一的形式,便于系统间的互操作和通信。
  • 优化性能和安全性:
    门面模式还可以用来控制对子系统的并发访问,比如数据库连接池就是一个典型的例子,它提供了一个统一的入口来管理数据库连接资源,优化了性能并增强了系统的安全性。

4.总结

本篇谈到了门面模式的作用、使用方式及其应用场景。因其能够有效解决系统复杂性、降低耦合度、提高可维护性和扩展性等问题,在各种软件架构设计和业务场景中得到了广泛的运用,在各类开发项目中随处可见。

02-29 03:00