外观模式


外观模式

1.基础知识

定义∶

又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口

外观模式定义了一个高层接口,让子系统更容易使用

类型∶结构型

相当于系统是一个黑箱,用户不需要关心内部的具体流程,达到用户目的即可!

spring中controller层的概念就算是外观模式了,调用一个方法返回数据,但是并不关心内部的具体流程

应用层只和主系统交互,和子系统没有联系

适用场景

子系统越来越复杂,增加外观模式提供简单调用接口

构建多层系统结构,利用外观对象作为每层的入口,简化层间调用

优点

简化了调用过程,无需了解深入子系统,防止带来风险。

减少系统依赖、松散耦合

更好的划分访问层次

符合迪米特法则,即最少知道原则

缺点

增加子系统、扩展子系统行为容易引入风险

不符合开闭原则

相关设计模式

外观模式和中介者模式

外观模式和单例模式

外观模式和抽象工厂模式


2.实战

这里假设一个在KFC中用积分兑换奥尔良鸡腿堡的业务场景

1.校验用户可用积分是否大于兑换积分?

2.积分支付成功 保存支付记录

3.生成对应的取餐码 ,将取餐码推送给用户

UML图如下:注意外观模式,test只会调用主系统即GiftExchangeService

image-20220118205042890

/**
 * @Author LYS
 * @Date 2022/1/18 20:44
 * @Version 1.0
 */
public class GiftExchangeService {
    private QualifyService qualifyService = new QualifyService();
    private PointsPaymentService pointsPaymentService = new PointsPaymentService();
    private ShippingService shippingService = new ShippingService();

    public void giftExchange(PointsGift pointsGift){
        if(qualifyService.isAvailable(pointsGift)){
            //积分校验通过
            if(pointsPaymentService.pay(pointsGift)){
                //如果支付积分成功
                String shippingOrderNo = shippingService.shipGift(pointsGift);
                System.out.println("下单成功,订单号是:"+shippingOrderNo);
            }
        }
    }
}
/**
 * @Author LYS
 * @Date 2022/1/18 20:43
 * @Version 1.0
 */
public class PointsGift {
    private String name;

    public PointsGift(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
/**
 * @Author LYS
 * @Date 2022/1/18 20:44
 * @Version 1.0
 */
public class PointsPaymentService {
    public boolean pay(PointsGift pointsGift) {
        //扣减积分,保存支付记录
        System.out.println("支付" + pointsGift.getName() + " 积分成功!保存支付记录");
        return true;
    }
}
/**
 * @Author LYS
 * @Date 2022/1/18 20:44
 * @Version 1.0
 */
public class QualifyService {
    public boolean isAvailable(PointsGift pointsGift) {
        System.out.println("校验" + pointsGift.getName() + " 积分资格通过,用户可支付积分大于商品积分");
        return true;
    }
}
/**
 * @Author LYS
 * @Date 2022/1/18 20:44
 * @Version 1.0
 */
public class ShippingService {
    public String shipGift(PointsGift pointsGift) {
        //生成对应的取餐码 ,将取餐码推送给用户
        System.out.println(pointsGift.getName() + "生成对应的取餐码 ,将取餐码推送给用户");
        String shippingOrderNo = "054";
        return shippingOrderNo;
    }
}
/**
 * @Author LYS
 * @Date 2022/1/18 20:45
 * @Version 1.0
 */
public class Test {
    public static void main(String[] args) {
        PointsGift pointsGift = new PointsGift("奥尔良鸡腿堡");
        GiftExchangeService giftExchangeService = new GiftExchangeService();
        giftExchangeService.giftExchange(pointsGift);
    }
}

image-20220118205156686


3.源码

以facade结尾的类就是外观模式

spring JdbcUtils

public abstract class JdbcUtils {

一系列对链接的操作:

image-20220118205358205

相关