Java設計模式之(九)——門面模式

YSOcean發表於2021-11-26

1、什麼是門面模式?

Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.

門面模式(Facade Pattern):也叫外觀模式,要求一個子系統的外部與其內部的通訊必須通過一個統一的物件進行。 門面模式提供一個高層次的介面,使得子系統更易於使用。

說人話:假設有一個系統 A,提供了 a、b、c、d 四個介面。系統 B 完成某個業務功能,需要呼叫 A 系統的 a、b、d 介面。利用門面模式,我們提供一個包裹 a、b、d 介面呼叫的門面介面 x,給系統 B 直接使用。至於為什麼要這樣做,下文會告訴你。

2、門面模式定義

image-20210911234615889

①、Facade 門面角色

此角色知曉子系統的所有功能和責任,客戶端可以呼叫這個角色的方法,會將所有從客戶端發來的請求委派到相應的子系統去, 也就說該角色沒有實際的業務邏輯, 只是一個委託類。

②、Subsystem 子系統角色

可以同時有一個或者多個子系統。 每一個子系統都不是一個單獨的類, 而是一個類的集合。 子系統並不知道門面的存在。 對於子系統而言, 門面僅僅是另外一個客戶端而已。

3、門面模式通用程式碼實現

/**
 * 子系統A
 */
public class ClassA {
    public void doA(){
        System.out.println("子系統A方法");
    }
}
/**
 * 子系統B
 */
public class ClassB {
    public void doB(){
        System.out.println("子系統B方法");
    }
}
/**
 * 子系統C
 */
public class ClassC {
    public void doC(){
        System.out.println("子系統C方法");
    }
}
/**
 * 門面角色
 */
public class Facade {
    private ClassA a = new ClassA();
    private ClassB b = new ClassB();
    private ClassC c= new ClassC();

    // 提供給外部訪問的方法
    public void doSomething(){
        this.a.doA();
        this.b.doB();
        this.c.doC();
    }
}

看上去,沒有門面角色,我們自己去呼叫三個子系統的方法也是一樣,但是假如三個子系統之間有先後順序,還有來自不同網路開銷,我們通過門面模式提供的方法,就遮蔽了這些差異,讓我們只需要呼叫門面角色提供給我們的方法即可。

4、門面模式優點

①、減少系統的相互依賴

如果我們不使用門面模式, 外界訪問直接深入到子系統內部, 相互之間是一種強耦合關係, 你死我就死, 你活我才能活, 這樣的強依賴是系統設計所不能接受的, 門面模式的出現就很好地解決了該問題, 所有的依賴都是對門面物件的依賴, 與子系統無關。

②、提高安全性

想讓你訪問子系統的哪些業務就開通哪些邏輯, 不在門面上開通的方法, 你休想訪問到。

5、門面模式應用場景

①、解決易用性問題

門面模式可以用來封裝系統的底層實現,隱藏系統的複雜性,提供一組更加簡單易用、更高層的介面。

②、解決效能問題

通過將多個介面呼叫替換為一個門面介面呼叫,減少網路通訊成本,提高客戶端的響應速度。

③、解決分散式事務問題

需要呼叫多個子系統的介面方法,而這些介面要麼都成功,要麼都失敗,我們就可以利用門面模式包裹這些子系統介面,然後通過某種方法保證這些介面在一個事務中完成。

6、介面卡模式和門面模式區別

介面卡模式:主要做介面轉換,解決的是原介面和目標介面不匹配的問題。
門面模式:主要做介面整合,解決的是多介面呼叫帶來的問題。

相關文章