• 外观模式


    外观模式

    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

  • 相关阅读:
    Dynamics AX 2012 R2 配置E-Mail模板
    Dynamics AX 2012 R2 设置E-Mail
    Dynamics AX 2012 R2 为运行失败的批处理任务设置预警
    Dynamics AX 2012 R2 耗尽用户
    Dynamics AX 2012 R2 创建一个专用的批处理服务器
    Dynamics AX 2012 R2 创建一个带有负载均衡的服务器集群
    Dynamics AX 2012 R2 安装额外的AOS
    Dynamics AX 2012 R2 将系统用户账号连接到工作人员记录
    Dynamics AX 2012 R2 从代码中调用SSRS Report
    Dynamics AX 2012 R2 IIS WebSite Unauthorized 401
  • 原文地址:https://www.cnblogs.com/yslu/p/15819787.html
Copyright © 2020-2023  润新知