模型与算法

设计模式-外观模式

2019-08-07  本文已影响5人  NealLemon

定义

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

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

适用场景

优点

缺点

代码

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

  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中也有很多对应的外观模式的实现。在我们阅读源码的过程中,稍加注意就可以找到。

上一篇 下一篇

猜你喜欢

热点阅读