初識設計模式 – 外觀模式

簡介

外觀設計模式(Facade Design Pattern)又被叫作門面模式,其描述是,通過為多個複雜的子系統提供統一的介面,使得子系統更容易被使用。

在現實生活中,常常存在辦事複雜的情況,如辦理房產證或者註冊公司,有時需要跑幾個部門才能辦成,如果這些部門都在一個地方,或者是成立一個綜合部門就方便很多。

對於上述例子,成立綜合部分就相當於使用外觀模式,為客戶端提供統一的介面,從而降低的系統的耦合度、降低客戶端的使用難度。

具體實現

創建一個抽象的圖形介面,定義一個畫圖的行為:

public interface Shape {
    void draw();
}

實現一個畫圓形的具體類:

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("在這裡畫圓形!");
    }
}

定義一個畫正方形的具體類:

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("在這裡畫正方形!");
    }
}

隨著具體類越來越多,客戶端調用這些類也變得更多,則耦合度變得越來越高。這時就可以通過外觀模式將這些具體類匯總到同一個介面中,客戶端只需掌握這個外觀類即可。

定義一個圖形類的外觀類,將具體類都注入到其中:

public class ShapeFacade {
    private final Shape circle = new Circle();  
    private final Shape square = new Square();

    public void drawCircle() {
        circle.draw();
    }

    public void drawSquare() {
        square.draw();
    }
}

總結

優點

外觀模式的主要優點如下:

  • 降低了子系統與客戶端的耦合度,使得子系統的變化不會影響調用它的客戶端
  • 對客戶端屏蔽了子系統組件,減少了客戶處理的對象數目,使得子系統使用起來更加簡便
  • 只是提供了一個訪問子系統的統一入口,並不影響客戶端直接使用子系統類

缺點

外觀模式的主要缺點如下:

  • 不能很好地限制客戶端使用子系統類,很容易帶來未知風險
  • 增加新的子系統類可能需要修改外觀類或者客戶端的程式碼,違背了開閉原則

適用場景

外觀模式的適用場景如下:

  • 解決易用性問題,當需要訪問一系列複雜的子系統時,外觀模式可以為客戶端提供簡單的入口
  • 解決性能問題,調用多個介面改成調用一個統一介面,可以減少網路通訊成本
  • 解決分散式事務問題,對於不同模組還需要保持事務性,則可以設計一個包括兩個操作的新介面在同一個事務里執行

源碼

外觀模式是一種使用頻率非常高的設計模式,如 JDK 中的 java.util.logging.LogManager 簡單地使用了外觀模式,其中統一了 SystemLoggerContextLoggerContext 這兩個內部類。