概念:
又稱門面模式,隱藏系統(tǒng)的復雜性,并向客戶端提供了一個客戶端可以訪問系統(tǒng)的接口。這種類型的設計模式屬于結(jié)構(gòu)型模式,它向現(xiàn)有的系統(tǒng)添加一個接口,來隱藏系統(tǒng)的復雜性。
外部應用程序不用關心內(nèi)部子系統(tǒng)的具體的細節(jié),這樣會大大降低應用程序的復雜度,提高了程序的可維護性。
這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現(xiàn)有系統(tǒng)類方法的委托調(diào)用。
外觀模式是“迪米特法則”的典型應用。
結(jié)構(gòu):
外觀(Facade)角色:為多個子系統(tǒng)對外提供一個共同的接口。
子系統(tǒng)(Sub System)角色:實現(xiàn)系統(tǒng)的部分功能,客戶可以通過外觀角色訪問它。
實現(xiàn)案例:
以實現(xiàn)一個系統(tǒng)的簡單架構(gòu)為例,客戶端需要使用三個子系統(tǒng)(HttpRequest、ImageLoader、Common)提供的功能方法,這里用外觀類(Facade),對這些子系統(tǒng)進行委托調(diào)用。
//子系統(tǒng)1
public class HttpRequest {
public void init() {
System.out.println("初始化... HttpRequest");
}
public void request() {
System.out.println("執(zhí)行網(wǎng)絡請求... http");
}
}
//子系統(tǒng)2
public class ImageLoader {
public void init() {
System.out.println("初始化... ImageLoader");
}
public void load() {
System.out.println("加載圖片...image");
}
}
//子系統(tǒng)3
public class Common {
public void init() {
System.out.println("初始化... Common");
}
public void method() {
System.out.println("執(zhí)行公共方法... common");
}
}
//外觀類
public class Facade {
private Common common;
private HttpRequest httpRequest;
private ImageLoader imageLoader;
public Facade() {
common = new Common();
httpRequest = new HttpRequest();
imageLoader = new ImageLoader();
}
public void init() {
common.init();
httpRequest.init();
imageLoader.init();
}
public void httpRequest() {
httpRequest.request();
}
public void loadImage() {
imageLoader.load();
}
public void commonMethod() {
common.method();
}
}
public class Test {
public static void main(String[] args) {
Facade facade = new Facade();
facade.init();
System.out.println(">>>>>>>>>>>>>>>>>");
facade.httpRequest();
facade.commonMethod();
facade.loadImage();
}
}
系統(tǒng)設計常用的一種模式,案例中Facade聚合了各個子系統(tǒng),并對子系統(tǒng)的功能方法對外提供了統(tǒng)一的封裝。
優(yōu)點:
1、減少系統(tǒng)相互依賴。
2、提高靈活性。
3、提高了安全性。
缺點:
不符合開閉原則,修改起來很麻煩。
使用場景:
1、當一個復雜系統(tǒng)的子系統(tǒng)很多時,外觀模式可以為系統(tǒng)設計一個簡單的接口供外界訪問。
2、當客戶端與多個子系統(tǒng)之間存在很大的聯(lián)系時,引入外觀模式可將它們分離,從而提高子系統(tǒng)的獨立性和可移植性。