java设计模式(六)——门面模式

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

原文地址:https://www.cnblogs.com/tdyang/p/13259448.html