设计模式-外观模式

定义

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

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

适用场景

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

优点

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

缺点

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

代码

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容