外观模式(Facade Pattern)

一、简述

Facade 模式将子系统中的各类(或结构与方法)包装成一个简明一致的界面,目的就是想对外部用户隐藏系统、模块和类的复杂性,提供给用户一个简单易用的使用接口,使子系统更加容易使用。它是为子系统中的一组接口所提供的一个一致的界面。
Facade模式结构

二、作用及应用场景

1️⃣作用

  1. 松散耦合,外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
  2. 简单易用,外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。
  3. 更好的划分访问层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

2️⃣应用场景

  1. 为复杂系统提供简单的接口。
  2. 客户程序与抽象类的实现部分分离。
  3. 构建层次系统时,用作入口。
  4. Facade 一个典型应用就是数据库 JDBC 的应用。

三、示例

OrderService 封装了操作 Order 的相关逻辑(增删改查),在目前的系统中运行良好。现在有一个新的需求,外部其他模块(或其他系统)需要查询订单的信息,如果将 OrderService 全部暴露出去,会带来风险,比如其他系统可能会将订单删除。此时可以使用 Facade 模式,只提供客户需要的操作。

URL类图

系统中的已有逻辑类:

public class OrderService {
    public void add(Order order) {
        System.out.println("add order: " + order);
    }
    public void delete(String orderId) {
        System.out.println("delete order: " + orderId);
    }
    public void modify(Order order) {
        System.out.println("modify order: " + order);
    }
    public Order query(String orderId) {
        System.out.println("load order: " + orderId);
        return new Order();
    }
}

提供给外部客户使用的查询类:

public class OrderQueryServiceFacade {
    @Resource
    private OrderService orderService;
    public OrderQueryServiceFacade(OrderService orderService) {
        super();
        this.orderService = orderService;
    }
    /*
     * 这里是需要暴露的操作,不一定与原接口相同。比如下面的 queryById
     */
    public Order query(String orderId) {
        return this.orderService.query(orderId);
    }
    public Order queryById(String orderId) {
        return this.query(orderId);
    }
}

这是一个简单的例子,简单到只是隐藏了类的一些操作。更多 Facade 应用场景是隐藏整个系统(模块)的复杂性,对外部提供一个简单的操作界面。
比如,电子商务系统中,商品管理系统,涉及下游其他系统(比如说移动应用)关心的所有信息。移动应用可能仅仅是需要查询某些商品的信息(库存量、描述信息等),如果直接和系统内部交互,复杂不说,也是不安全的,这时候可以单独提供一个商品中心的门面出来(具体实现可以采用:RMI、Hessian 或者 Web Service)。这样下游系统就只需要与这个门面进行交互,而不必关心商品管理系统内部的复杂度了。

你可能感兴趣的:(外观模式(Facade Pattern))