美文网首页模型与算法
设计模式-外观模式

设计模式-外观模式

作者: NealLemon | 来源:发表于2019-08-07 07:38 被阅读5次

    定义

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

    定义了一个高层接口,让子系统更容易使用。

    适用场景

    • 子系统越来越复杂,增加外观模式提供简单调用接口。
    • 构建多层系统结构,利用外观对象作为每层的入口,简化层间调用。

    优点

    • 简化了调用过程,无需了解深入子系统,防止带来风险。
    • 减少系统依赖,松散耦合。
    • 更好的划分访问层次。
    • 符合迪米特法则。

    缺点

    • 增加子系统,扩展子系统行为容易引入风险。
      • 不符合开闭原则。

    代码

    我们下面来实现这么一个业务场景,在我们网上购买商品时,会有这么一个简单流程

    1. 检查是否有库存,是否可以进行购买
    2. 购买,付款
    3. 扣库存
    4. 购买成功
    5. 物流系统

    我们要实现这个简单的流程需要3个服务以及一个上层接口服务。下面我们就来看一下使用外观模式下的购买流程。

    检查库存服务--StockService

    库存服务包括检查库存和扣除库存。

    /**
     * 库存服务
     */
    public class StockService {
    
        /**
         * 检查是否有库存
         * @param serNo  商品序列号
         * @return
         */
        public boolean haveStock(String serNo) {
            System.out.println("检查商品系列号为:" + serNo +"的商品是否有货");
            return true;
        }
    
        public boolean reduce(String serNo) {
            System.out.println("扣库存,商品号为:" + serNo);
            return true;
        }
    }
    

    付款服务 -- PayService

    /**
     * 付款服务
     */
    public class PayService {
    
        /**
         * 付款服务
         * @param money  付款钱数
         * @return
         */
        public boolean pay(String money) {
            System.out.println("成功支付:" + money + "元");
            return true;
        }
    }
    

    物流服务 -- DeliveryService

    /**
     * 物流服务
     */
    public class DeliveryService {
    
        public String isDelivery(String SerNo) {
            String id = "007";
            System.out.println("商品发货,订单号为:" + id);
            return id;
        }
    }
    

    上层服务(外观者模式接口服务)--ShoppingTopService

    /**
     * 上层服务
     */
    public class ShoppingTopService {
        private DeliveryService deliveryService;
        private PayService payService;
        private StockService stockService;
        /**
         * 模拟pring 构造注入
         */
        public ShoppingTopService() {
            this.deliveryService = new DeliveryService();
            this.payService = new PayService();
            this.stockService = new StockService();
        }
    
        public void buy(String serNo) {
            if(stockService.haveStock(serNo)) {   //检查库存
                if(payService.pay("10000")) { //付款
                    if(stockService.reduce(serNo)) {  //扣库存
                        String deliveryId = deliveryService.isDelivery(serNo); //物流服务
                        System.out.println("交易完成,发货完成,物流号: " + deliveryId);
                    }
                }
            }
        }
    }
    

    启动 -- FacadeBootStrap

    public class FacadeBootStrap {
    
        public static void main(String[] args) {
            ShoppingTopService shoppingTopService = new ShoppingTopService();
            shoppingTopService.buy("9999");
        }
    }
    

    输出

    facade.jpg

    UML 类图

    facadeUMl.jpg

    通过类图我们可以明显看到外观模式的优点。

    小结

    不光是tomcat 例如Spring,Mybatis中也有很多对应的外观模式的实现。在我们阅读源码的过程中,稍加注意就可以找到。

    相关文章

      网友评论

        本文标题:设计模式-外观模式

        本文链接:https://www.haomeiwen.com/subject/mwegdctx.html