天天看點

【設計模式】門面模式定義代碼實際場景 總結

  • 定義

       門面模式又叫外觀模式,它提供了一個同意的接口,用來對通路子系統中的多個接口。它的主要特性是定義了一個高層的接口,讓子系統更容易調用,是屬于一種結構型的設計模式。

  • 代碼

      1.通用的寫法,這裡建立三個子系統和和一個門面系統,門面系統提供三個方法分别調用子系統的方法。

public class SubSystemA {
    public void doA(){
        System.out.println("do a");
    }
}
           
public class SubSystemB {
    public void doB(){
        System.out.println("do b");
    }
}
           
public class SubSystemC {
    public void doC(){
        System.out.println("do c");
    }
}
           
public class Facade {
    private SubSystemA subSystemA = new SubSystemA();
    private SubSystemB subSystemB = new SubSystemB();
    private SubSystemC subSystemC = new SubSystemC();

    public void doA(){
        this.subSystemA.doA();
    }

    public void doB(){
        this.subSystemB.doB();
    }

    public void doC(){
        this.subSystemC.doC();
    }
}
           

    2. 寫一個測試類,建立門面系統,然後調用方法。

public class Test {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.doA();
        facade.doB();
        facade.doC();
    }
}
           

   3. 檢視結果。

【設計模式】門面模式定義代碼實際場景 總結

   4. 類的結構圖。

【設計模式】門面模式定義代碼實際場景 總結
  • 實際場景

      比如模拟一個商品積分兌換的場景,兌換一個商品需要三個步驟:1.确認使用者的積分是否足夠。2.完成支付流程。3.進入物流。這裡就分别建立這三個系統(Service類),然後建立一個門面系統。然後在門面系統中分貝調用這三個子系統的服務。

     1.建立商品類。

/**
 * 訂單類
 */
public class Order {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
           

      2.建立積分校驗系統。

/**
 * 積分校驗系統
 */
public class QulifyService {
    public boolean isAvilible(Order order) {
        System.out.println("積分庫積分校驗通過,足夠兌換物品" + order.getName());
        return true;
    }
}
           

     3.建立支付系統。

/**
 * 支付系統
 */
public class PayService {
    public boolean pay(Order order){
        System.out.println("兌換商品" + order.getName() + "成功,積分已被扣除");
        return true;
    }
}
           

     4.建立物流系統。

/**
 * 物流系統
 */
public class DeliveryService {
    public String delivery(Order order){
        System.out.println("進入物流系統,商品已在快遞中...");
        return "666";
    }
}
           

     5.建立門面系統。

public class OrderFacadeService {
    private QulifyService qulifyService = new QulifyService();
    private PayService payService = new PayService();
    private DeliveryService deliveryService = new DeliveryService();

    public void exchange(Order order) {
        if (qulifyService.isAvilible(order)) {
            if (payService.pay(order)) {
                String deliveryNo = deliveryService.delivery(order);
                System.out.println("下單成功,物流單号為:" + deliveryNo);
            }
        }
    }
}
           

    6.測試調用。

public class Test {
    public static void main(String[] args) {
        Order order = new Order();
        order.setName("《Java 技術核心卷2》");

        OrderFacadeService orderFacadeService = new OrderFacadeService();
        orderFacadeService.exchange(order);
    }
}
           

    7.檢視結果。

【設計模式】門面模式定義代碼實際場景 總結
  •  總結

    1.門面模式的優點:

     (1)簡化了調用的過程,無需深入的了解子系統,以防給子系統帶來風險。

     (2)減少系統依賴,降低耦合。

     (3)更好的劃分了通路的層次,提高了安全性。

     (4)遵循迪米特法則,即最少知道原則。

    2.門面模式的缺點:

     (1)當子系統的功能需要擴充時,門面系統也需要進行擴充。容易帶來未知的風險。

     (2)不符合開閉原則。

     (3)某些情況下可能違背單一職責原則。