首頁 > 軟體

Java設計模式中的門面模式詳解

2022-09-24 14:00:55

門面模式

概述

門面模式(Facade Pattern)又叫外觀模式,屬於結構性模式。

它提供一個統一的介面去存取多個子系統的多個不同的介面,它為子系統中的一組介面提供一個統一的高層介面。使得子系統更容易使用。

使用者端不需要知道系統內部的複雜聯絡,只需定義系統的入口。即在使用者端和複雜系統之間再加一層,這一層將呼叫順序、依賴關係等處理好。

應用場景

為複雜的模組或子系統提供外界存取的模組。

子系統相對獨立。 

預防額外操作帶來的風險。

目的

降低存取複雜系統的內部子系統時的複雜度,簡化使用者端之間的介面。

優缺點

優點:

減少系統相互依賴。 

提高靈活性。 

提高安全性。

缺點:

不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合適。也就是說系統可以提供新的功能模組而不必進行修改。

主要角色

門面模式主要包含2種角色:

1.外觀角色(Facade):

外觀角色也稱門面角色,系統對外的統一介面;

2.子系統角色(SubSystem):

可以同時有一個或多個SubSystem。每個SubSytem都不是一個單獨的類,而是一個類的集合。

SubSystem並不知道Facade的存在,對於SubSystem而言,Facade只是另一個使用者端而已(即Facade對SubSystem透明)

門面模式的基本使用

建立子系統角色

建立2個建立子系統角色:SubSystemA 與SubSystemB

public class SubSystemA {
    public void subSystem() {
        System.out.println("subSystem A");
    }
}
public class SubSystemB {
    public void subSystem() {
        System.out.println("subSystem B");
    }
}

建立外觀角色

public class Facade {
    private SubSystemA a = new SubSystemA();
    private SubSystemB b = new SubSystemB();
    /**
     * 提供對外介面
     */
    public void subSystemA() {
        this.a.subSystem();
    }
    /**
     * 提供對外介面
     */
    public void subSystemB() {
        this.b.subSystem();
    }
}

使用者端呼叫

    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.subSystemA();
        facade.subSystemB();
    }

門面模式實現商城下單

如商城系統中的下單,下單過程可能涉及多個模組子系統的聯動操作,如果分別傳送網路請求各個模組子系統的介面,會增加一定複雜度與額外的網路請求。

此時可以採取門面模式,將所有相關介面整合到一個介面中,由後端提供一個介面給前端呼叫。

假設在一個商城系統中,涉及庫存系統、支付系統、物流系統、入口系統。使用者下單時進行校驗庫存,驗證支付,最後發貨這一整個過程串聯起來,提供一個統一介面供使用者端呼叫。

庫存系統

public class StockSys {
    /**
     * 庫存校驗
     */
    public Boolean verify(){
        if (Math.random()*10 >5) {
            System.out.println("StockSys verify success");
            return true;
        }
        System.out.println("StockSys verify fail");
        return  false;
    }
}

支付系統

public class PaySys {
    /**
     * 支付
     */
    public Boolean pay() {
        if (Math.random()*10 >2) {
            System.out.println("PaySys pay success");
            return true;
        }
        System.out.println("PaySys pay fail");
        return  false;
    }
}

物流系統

public class LogisticsSys {
    /**
     * 發貨
     */
    public void ship() {
        System.out.println("logistics ship");
    }
}

入口系統

public class MySys {
    StockSys stockSys = new StockSys();
    PaySys paySys = new PaySys();
    LogisticsSys logisticsSys = new LogisticsSys();
    public void order() {
        if (stockSys.verify()) {
            if (paySys.pay()) {
                logisticsSys.ship();
            }
        }
    }
}

使用者端呼叫

    public static void main(String[] args) {
        new MySys().order();
    }

StockSys verify success
PaySys pay success
logistics ship

StockSys verify fail

StockSys verify success
PaySys pay fail

到此這篇關於Java設計模式中的門面模式詳解的文章就介紹到這了,更多相關Java門面模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com