• 外观模式


    外观模式

    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

  • 相关阅读:
    SQL COUNT() 语法
    SQL AVG 函数
    Android开发
    IIf 函数
    励志
    王者归来
    Java基础知识总结(绝对经典)
    LeetCode算法题-Third Maximum Number(Java实现-四种解法)
    LeetCode算法题-Fizz Buzz(Java实现)
    LeetCode算法题-Longest Palindrome(五种解法)
  • 原文地址:https://www.cnblogs.com/yslu/p/15819787.html
Copyright © 2020-2023  润新知