Java设计模式之外观模式

Java设计模式之外观模式

外观模式也叫门面模式。

考虑这样一个业务场景,商城里面有积分兑换功能,比如1000积分可以兑换一个键盘等。这里可以拆分出三个子系统, 积分数量和礼物库存校验子系统,积分支付子系统,物流子系统。

//创建积分礼物类
public class PointGift {
    private String name;

    public PointGift(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}


//第一个子系统 校验积分是否足够,校验库存是否足够
public class QualityService {
    public boolean isAvailable(PointGift pointGift){
        System.out.println(pointGift.getName()+" 积分满足,库存满足!");
        return true;
    }
}

//第二个子系统,积分支付系统
public class PointPaymentService {
    public boolean pay(PointGift pointGift){
        System.out.println(pointGift.getName()+" 积分支付成功");
        return true;
    }

}

//第三个子系统,物流子系统
public class ShippingService {

    public String shipGift(PointGift pointGift){
        System.out.println(pointGift.getName()+"进入物流系统");
        String shippingOrderNo="666";
        return shippingOrderNo;
    }
}

//外观模式类,调用三个子系统
public class GiftExchangeService {
    private QualityService qualityService=new QualityService();
    private PointPaymentService paymentService=new PointPaymentService();
    private ShippingService shippingService=new ShippingService();

    public void giftExchange(PointGift pointGift){
        //校验积分数量和库存
        if (qualityService.isAvailable(pointGift)){
            //积分支付是否成功
            if (paymentService.pay(pointGift)){
                String shippingOrderNo=shippingService.shipGift(pointGift);
                System.out.println("物流系统下单成功,订单号是:"+shippingOrderNo);
            }
        }
    }
}

//应用层调用外观模式类
public class Test {
    public static void main(String[] a){
        PointGift pointGift =new PointGift("键盘");
        GiftExchangeService giftExchangeService=new GiftExchangeService();

        giftExchangeService.giftExchange(pointGift);
    }
}

//结果:
键盘 积分满足,库存满足!
键盘 积分支付成功
键盘进入物流系统
物流系统下单成功,订单号是:666

下面是UML的类图,从类图可以看出,应用层没有直接调用三个子系统,应用层只关心积分兑换功能,不关心三个子系统的具体实现以及调用方法,而这些都被封装在外观模式类GiftExchangeService,应用层直接调用外观模式类即可。与此同时,这也是遵循了迪米特法则,只需要知道该知道的。当然,如果需要新增子系统,就需要修改外观模式类,这样就违反了开闭原则。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章