定义
又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口。
定义了一个高层接口,让子系统更容易使用。
适用场景
- 子系统越来越复杂,增加外观模式提供简单调用接口。
- 构建多层系统结构,利用外观对象作为每层的入口,简化层间调用。
优点
- 简化了调用过程,无需了解深入子系统,防止带来风险。
- 减少系统依赖,松散耦合。
- 更好的划分访问层次。
- 符合迪米特法则。
缺点
- 增加子系统,扩展子系统行为容易引入风险。
- 不符合开闭原则。
代码
我们下面来实现这么一个业务场景,在我们网上购买商品时,会有这么一个简单流程
- 检查是否有库存,是否可以进行购买
- 购买,付款
- 扣库存
- 购买成功
- 物流系统
我们要实现这个简单的流程需要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.jpgUML 类图
facadeUMl.jpg通过类图我们可以明显看到外观模式的优点。
小结
不光是tomcat
例如Spring
,Mybatis
中也有很多对应的外观模式的实现。在我们阅读源码的过程中,稍加注意就可以找到。
网友评论