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,應用層直接調用外觀模式類即可。與此同時,這也是遵循了迪米特法則,只需要知道該知道的。當然,如果需要新增子系統,就需要修改外觀模式類,這樣就違反了開閉原則。

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