1. 程式人生 > >java設計模式精講 Debug 方式+記憶體分析 第10章 外觀模式

java設計模式精講 Debug 方式+記憶體分析 第10章 外觀模式

外觀模式

10-1 外觀模式講解

在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述


在這裡插入圖片描述


11-2 裝飾者模式coding

有一個積分禮物類:

/** 積分禮物 */
public class PointsGift {
    private String name;

    public PointsGift(String name) {
        this
.name = name; } public String getName() { return name; } }

校驗類:是否有資格

public class QualifyService {
    public boolean isAvailable(PointsGift pointsGift) {
        System.out.println("校驗"+pointsGift.getName()+"積分資格通過,庫存通過");
        return true;
    }
}

積分支付類:

public
class PointsPaymentService { public boolean pay(PointsGift pointsGift) { /** 扣減積分 */ System.out.println("支付"+pointsGift.getName()+" 積分成功"); return true; } }

還要一個物流子系統:

public class ShippingService {
    public String shipGift(PointsGift pointsGift) {
        /** 物流系統對接邏輯 */
System.out.println(pointsGift.getName() + "進入物流系統"); String shippingOrderNo = "666"; return shippingOrderNo; } }

積分交換交易:

public class GiftExchangeService {
    private QualifyService qualifyService;
    private PointsPaymentService pointsPaymentService;
    private ShippingService shippingService;

    public void setQualifyService(QualifyService qualifyService) {
        this.qualifyService = qualifyService;
    }

    public void setPointsPaymentService(PointsPaymentService pointsPaymentService) {
        this.pointsPaymentService = pointsPaymentService;
    }

    public void setShippingService(ShippingService shippingService) {
        this.shippingService = shippingService;
    }

    public void giftExchange(PointsGift pointsGift) {
        if (qualifyService.isAvailable(pointsGift)) {
            /** 資格檢驗通過 */
            if (pointsPaymentService.pay(pointsGift)) {
                //如果積分支付成功,那麼就是可以返回訂單號了
                String shippingOrderNo = shippingService.shipGift(pointsGift);
                System.out.println("物流訂單系統下單成功,訂單號是:"+shippingOrderNo);
            }
        }
    }
}

這個就是外觀模式的類圖:
在這裡插入圖片描述


測試程式碼:

public class Test {
    public static void main(String[]args){
        PointsGift pointsGift = new PointsGift("T恤");
        GiftExchangeService giftExchangeService = new GiftExchangeService();

        giftExchangeService.setQualifyService(new QualifyService());
        giftExchangeService.setPointsPaymentService(new PointsPaymentService());
        giftExchangeService.setShippingService(new ShippingService());

        giftExchangeService.giftExchange(pointsGift);
    }
}

執行結果:

校驗T恤積分資格通過,庫存通過
支付T恤 積分成功
T恤進入物流系統
物流訂單系統下單成功,訂單號是:666


這個就是現在的類圖:
在這裡插入圖片描述


這裡和子系統有關聯關係是因為沒有整合Spring,我們可以模擬一下,在外觀類裡面直接new出例項:

public class GiftExchangeService {
    private QualifyService qualifyService  = new QualifyService();
    private PointsPaymentService pointsPaymentService = new PointsPaymentService();
    private ShippingService shippingService = new ShippingService();


    public void giftExchange(PointsGift pointsGift) {
        if (qualifyService.isAvailable(pointsGift)) {
            /** 資格檢驗通過 */
            if (pointsPaymentService.pay(pointsGift)) {
                //如果積分支付成功,那麼就是可以返回訂單號了
                String shippingOrderNo = shippingService.shipGift(pointsGift);
                System.out.println("物流訂單系統下單成功,訂單號是:"+shippingOrderNo);
            }
        }
    }
}

測試類:

public class Test {
    public static void main(String[]args){
        PointsGift pointsGift = new PointsGift("T恤");
        GiftExchangeService giftExchangeService = new GiftExchangeService();
        giftExchangeService.giftExchange(pointsGift);
    }
}

這個時候的類圖就這樣的:
在這裡插入圖片描述
我們還可以用抽象外觀類來實現;


11-3 裝飾者模式原始碼解析(spring-session mybatis jdk servlet)

在這裡插入圖片描述