外觀模式

外觀模式

定義

又叫門面模式,提供了一個統一的接口,用來訪問子系統中的一羣接口。定義了一個高層接口,讓子系統更容易使用。java

類型

結構型設計模式

使用場景
  1. 子系統愈來愈複雜,增長外觀模式提供的簡單調用接口
  2. 構建多層系統結構,利用外觀對象做爲每層的入口,簡化層間調用。
優勢
  1. 簡化了調用過程,無需瞭解深刻子系統,防止來風險。
  2. 減小系統的依賴、鬆散耦合
  3. 更好的劃分訪問層次
  4. 符合迪米特法則,即最少知道原則。
缺點
  1. 增長子系統、擴展子系統行爲容易引入風險
  2. 增長子系統的時候不符合開閉原則
相關設計模式

外觀模式與中介模式 ~ 外觀模式強調的是外界對子系統的交互。中介者模式強調的是子系統之間的交互。測試

外觀模式和單例模式 ~ 一般咱們會把外觀模式的外觀對象作成單例對象this

外觀模式和抽象工廠 ~ 咱們能夠經過抽象工廠來獲取子系統的實例,這樣子系統能夠經過外觀實例對外觀屏蔽。編碼

下面開始看代碼。在寫代碼以前咱們先假設一個應用場景,假設咱們有個積分商城,這個積分商城就包含如下幾個子系統。好比積分校驗,物流系統,積分支付子系統等子系統。spa

首先咱們建立一個禮物實體類。設計

public class PointsGift {
    private String name;

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

    public String getName() {
        return name;
    }
}
複製代碼

模擬一個積分校驗系統,看看用戶是否知足兌換資格。code

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 = 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 FacadeTest {
    public static void main(String[] args) {
        PointsGift pointsGift = new PointsGift("T恤");
        GiftExchangeService giftExchangeService = new GiftExchangeService();
        giftExchangeService.giftExchange(pointsGift);
    }
}
複製代碼

咱們這裏的測試類只和外觀類交互,而後經過外觀類和各個子系統交互。外觀模式很簡單,就講到這裏。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息