1、基本概念
门面模式又称为外观模式,提供统一的接口,来访问子系统的一系列接口,属于结构型模式
是一种很常见的设计模式,比如:我们经常用的controller,一个客户下单,它去调用订单接口,订单接口里面
可能会去调用积分系统,支付系统,优惠券系统等的接口,这样客户端就不必多求次发起请求
2、案例
案例:一个订单下单,先去判断是否有优惠券,判断是否支付成功,最后加积分。
门面角色:
public class OrderServiceFacade { private CouponService couponService = new CouponService(); private IntegralService integralService = new IntegralService(); private PaymentService paymentService = new PaymentService(); public String placeOrder(OrderInfo orderInfo){ if(couponService.isHaveCoupon(orderInfo)){ if(paymentService.isSuccessPay(orderInfo)){ integralService.addIntegral(orderInfo); }else{ return "我太穷了^^"; } }else{ return "太贵了买不起"; } return orderInfo.getName()+"就是好"; } }
子系统角色:CouponService
public class CouponService { public boolean isHaveCoupon(OrderInfo orderInfo){ System.out.println("商品:"+orderInfo.getName()+",价格:"+orderInfo.getPrice()+",有优惠券30块"); return true; } }
子系统角色:PaymentService
public class PaymentService { public boolean isSuccessPay(OrderInfo orderInfo){ System.out.println("商品:"+orderInfo.getName()+",价格:"+orderInfo.getPrice()+",已成功支付"); return true; } }
子系统角色:IntegralService
public class IntegralService { public void addIntegral(OrderInfo orderInfo){ System.out.println("商品:"+orderInfo.getName()+",价格:"+orderInfo.getPrice()+",支付成功,添加积分99"); } }
测试类:
public class Test { public static void main(String[] args) { OrderServiceFacade orderServiceFacade = new OrderServiceFacade(); OrderInfo orderInfo = new OrderInfo("霸王洗发水",99.9); orderServiceFacade.placeOrder(orderInfo); } }
输出:
商品:霸王洗发水,价格:99.9,有优惠券30块 商品:霸王洗发水,价格:99.9,已成功支付 商品:霸王洗发水,价格:99.9,支付成功,添加积分99
我们常用的utils工具类,有时候就是一种门面模式
3、优缺点
门面模式的优点:
1、简化接口调用,不必一个接口一个接口的调用
2、符合迪米特法则,最少知道原则,调用接口只提供一个外在接口
3、减少系统依赖
缺点:
1、不符合开闭原则,当我们需要新增一个接口时,需要修改门面角色里面的代码
例如,我们需要增加物流系统,那么就要在支付成功后,加一段物流的业务代码。
2、子系统扩展可能会带来危险,例如积分系统无法使用,可能导致订单的失败等等