外观模式——门面担当

891 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战


哈喽,大家好,我是一条~

之前的《白话设计模式》因为工作被搁置,如今再次启航,并搭配框架源码解析一起食用,将理论与实战完美结合。

对设计模式不是很熟悉的同学可以先看一下《23种设计模式的一句话通俗解读》全面的了解一下设计模式,形成一个整体的框架,再逐个击破。

往期回顾设计模式合集

今天我们一块看一下外观模式,是结构型设计模式。

导图

定义

官方定义

外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。

通俗解读

结构图

代码演示

本文源码:

目录结构

建议跟着一条学设计模式的小伙伴都建一个maven工程,并安装lombok依赖和插件。

并建立如下包目录,便于归纳整理。

pom如下

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
    </dependency>

开发场景

对于电商系统下单的操作,需要和多个服务交互,简易流程如下:

点击下单 -> 检验库存 -> 支付金额 -> 物流信息。

一个操作,需要与三个子系统交互,及其复杂,所以需要用门面模式来集成三个服务,主类只与门面类交互。

代码实现

新建商品类Goods

import lombok.Builder;
import lombok.Data;
​
@Data
@Builder
public class Goods {
    private String name;
​
    private Integer price;
​
    // 其他商品属性省略
}

新建库存检验服务StockService

public class StockService {
    public boolean check(String name) {
        // 省略业务代码
        return true;
    }
}

新建支付服务PayService

// 价格一般以分为单位存储
public class PayService {
    public boolean pay(Integer price) {
        System.out.println("支付"+price/100.0+"元");
        return true;
    }
}

新建物流服务LogisticsService

public class LogisticsService {
    public void push() {
        System.out.println("已发货");
    }
}

新建门面类FacadeService

public class FacadeService {
​
    private PayService payService=new PayService();
    private LogisticsService logisticsService=new LogisticsService();
    private StockService stockService=new StockService();
​
    public void order(Goods goods){
        // 校验库存
        if (stockService.check(goods.getName())){
            System.out.println("库存充足,请支付");
            // 支付
            payService.pay(goods.getPrice());
            // 发货
            logisticsService.push();
        }else{
            System.out.println("库存不足");
        }
​
    }
}

新建测试类MainTest

public class MainTest {
    public static void main(String[] args) {
        // 建造者模式
        Goods iPhone13 = Goods.builder()
                .name("IPhone13")
                .price(599999)
                .build();
        // 外观模式
        FacadeService facadeService = new FacadeService();
        facadeService.order(iPhone13);
​
    }
}

输出结果:

应用场景

什么场景使用?

  • 去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。以此类比......
  • JAVA 的三层开发模式。
  • 分布式系统的网关
  • Tomcat源码中的RequestFacade干什么的?