zoukankan      html  css  js  c++  java
  • 设计模式-外观模式

    一、定义

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

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

    类型:结构型

    二、使用场景

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

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

    三、优点

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

    减少系统依赖、松散耦合

    更好的划分访问层次

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

    四、缺点

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

    不符合开闭原则

    五、外观模式和中介者模式

    本质区别

    1、外观模式关注是外界和子系统的交互

    2、中介者模式关注的是子系统内部的交互

    六、外观模式和单例模式

    通常会把外观模式中的外观对象做成单例模式

    七、外观模式和抽象工厂模式

    外观类通过抽象工厂获取子系统的实例,这样子系统可以将内部对外观类进行屏蔽,这也是设计模式结合使用的一种方式。

    八、Code

    1.创建PointsGift类

    /**
     *积分礼物
     */
    public class PointsGift {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public PointsGift(String name){
            this.name = name;
        }
    
    }
    

      

    2. 创建QualifyService类

    /**
     * 资格服务
     */
    public class QualifyService {
    
        /**
         * 资格检验
         */
        public boolean isAvailable(PointsGift pointsGift){
            System.out.println("检验" + pointsGift.getName() + " 积分资格通过,库存通过");
            return  true;
        }
    
    }
    

      

    3. 创建PointsPaymentService 类

    public class PointsPaymentService {
    
        public boolean pay(PointsGift pointsGift){
            //扣减积分
            System.out.println("支付" + pointsGift.getName() + " 积分成功");
            return  true;
        }
    
    }
    

      

    4. 创建ShippingService 类

    /**
     * 物流子系统
     */
    public class ShippingService {
        public  String shipGift(PointsGift pointsGift){
            //物流系统的对接逻辑
            System.out.println(pointsGift.getName() + "进入物流系统");
            String shippingOrderNo = "123";
            return  shippingOrderNo;
    
        }
    }
    

      

    5. 创建GiftExchangeService类

    /**
     * 礼物对换服务
     */
    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);
                }
            }
        }
    }
    

      

    6. 创建测试类

    public class Test {
        public static void main(String[] args) {
            PointsGift pointsGift = new PointsGift("帽子");
            GiftExchangeService giftExchangeService = new GiftExchangeService();
            giftExchangeService.giftExchange(pointsGift);
        }
    }
    

      

    7. UML图

    九、在JDK或者第三方源码中的应用

    1.Spring JDBC JdbcUtils类

    2. Mybatis中的Configuration类

    3. Tomcat中的RequestFacade类和Request类

  • 相关阅读:
    How to function call using 'this' inside forEach loop
    jquery.validate.unobtrusive not working with dynamic injected elements
    Difference between jQuery.extend and jQuery.fn.extend?
    Methods, Computed, and Watchers in Vue.js
    Caution using watchers for objects in Vue
    How to Watch Deep Data Structures in Vue (Arrays and Objects)
    Page: DOMContentLoaded, load, beforeunload, unload
    linux bridge
    linux bridge
    EVE-NG网卡桥接
  • 原文地址:https://www.cnblogs.com/linlf03/p/9748229.html
Copyright © 2011-2022 走看看