外观模式

外观模式

一、定义

提供了一个统一的接口,用来访问子系统中的一群接口。(定义了一个高层接口,让子系统更容易使用。)

二、适用场景

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

三、优点

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

四、缺点

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

五、代码

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

  1. 检查是否有库存,是否可以进行购买
  2. 购买,付款
  3. 扣库存
  4. 购买成功
  5. 物流系统
    我们要实现这个简单的流程需要3个服务以及一个上层接口服务。下面我们就来看一下使用外观模式下的购买流程。

5.1、检查库存服务–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;
    }
}

5.2、付款服务 – PayService

/**
 * 付款服务
 */
public class PayService {

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

5.3、物流服务 – DeliveryService

/**
 * 物流服务
 */
public class DeliveryService {

    public String isDelivery(String SerNo) {
        String id = "007";
        System.out.println("商品发货,订单号为:" + id);
        return id;
    }
}

5.4、上层服务(外观者模式接口服务)–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);
                }
            }
        }
    }
}

5.5、启动 – FacadeBootStrap

public class FacadeBootStrap {

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

5.6、输出

在这里插入图片描述

5.7、UML类图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值