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、子系统扩展可能会带来危险,例如积分系统无法使用,可能导致订单的失败等等