外觀模式
1.定義:
要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行。外觀模式提供一個高層次的接口,使得子系統更易于使用。
2.使用場景:
- 為一個復雜子系統提供一個簡易接口。外觀模式可以提供一個簡單統一的接口,對外隱藏子系統的具體實現、隔離變化;
- 當你需要構建一個層次結構的子系統時,使用外觀模式定義子系統中每層的入口點。如果各子系統之間是相互依賴的,那么通過外觀模式進行接口通信,使得各子系統之間相互解耦,達到各子系統互不依賴的效果。
3.UML圖
4.詳解:
外觀模式是開發過程中使用頻率極高的一種結構型設計模式。假如現在需要開發一個第三方SDK,一般都會使用外觀模式,對外隱藏系統內部的實現細節,僅提供一個統一的接口供外部調用,這樣既減低了用戶使用成本,也對用戶屏蔽了很多的實現細節。
下面看代碼舉例:
private static class SubSystemA {
private void start() {
System.out.println("sub system A start");
}
private void end() {
System.out.println("sub system A end");
}
}
private static class SubSystemB {
private void start() {
System.out.println("sub system B start");
}
private void end() {
System.out.println("sub system B end");
}
}
private static class SubSystemC {
private void start() {
System.out.println("sub system C start");
}
private void end() {
System.out.println("sub system C end");
}
}
上面三個類表示整個系統的三個子系統,下面是對外統一的外觀類,它持有三個子系統類的實例,并對外提供統一的接口(start/end),方便外部調用:
public static class SystemFacade {
private static SubSystemA subSystemA = new SubSystemA();
private static SubSystemB subSystemB = new SubSystemB();
private static SubSystemC subSystemC = new SubSystemC();
private void start() {
subSystemA.start();
subSystemB.start();
subSystemC.start();
}
private void end() {
subSystemA.end();
subSystemB.end();
subSystemC.end();
}
}
測試代碼:
public static void main(String[] args) {
SystemFacade systemFacade = new SystemFacade();
systemFacade.start();
systemFacade.end();
/**
sub system A start
sub system B start
sub system C start
sub system A end
sub system B end
sub system C end
*/
}
到這里,外觀模式的代碼舉例就結束了,從輸出結果一看便知,各子系統均參與了工作,而且它們之間完全解耦,達到預期目的。