初識設計模式 – 外觀模式
簡介
外觀設計模式(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
簡單地使用了外觀模式,其中統一了 SystemLoggerContext
和 LoggerContext
這兩個內部類。