基本介紹
定義
要求一個子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個統(tǒng)一的對象進(jìn)行。外觀模式提供一個高層次的接口,使得子系統(tǒng)更易于使用。
介紹
- 外觀模式屬于結(jié)構(gòu)型模式。
- 外觀模式也叫門面模式。
- 通常我們對API進(jìn)行封裝,都會用到外觀模式,只是我們可能不知道而已。外觀模式通過一個外觀類使得整個系統(tǒng)的結(jié)構(gòu)只有一個統(tǒng)一的高層接口,這樣能降低用戶的使用成本。
UML類圖

外觀模式UML類圖
角色說明:
- Facade(外觀角色):對外的統(tǒng)一入口。
- Complex System(復(fù)雜系統(tǒng)):一般由多個子系統(tǒng)構(gòu)成,負(fù)責(zé)具體功能的實現(xiàn)。
具體實現(xiàn)
我們玩游戲時一般都有登錄和充值等操作,這些一般都是第三方SDK來完成。游戲研發(fā)一般只需進(jìn)行簡單的接入就可以使用登錄充值功能了。我們來實現(xiàn)一個簡單的游戲SDK:
1、創(chuàng)建外觀角色。這里只要是封裝游戲SDK對外的接口,供游戲去研發(fā)去調(diào)用。這里只有兩個接口:登錄和充值。
public class GameSdk {
// 登錄接口
public void login() {
// 調(diào)用登錄子系統(tǒng)的接口
LoginManager loginManager = new LoginManager();
loginManager.login();
}
// 支付接口
public void pay(int momey) {
// 調(diào)用支付子系統(tǒng)的接口
PayManager payManager = new PayManager();
payManager.pay(momey);
}
}
2、子系統(tǒng)
// 登錄系統(tǒng)
public class LoginManager {
public void login() {
System.out.println("打開登錄界面");
System.out.println("進(jìn)行登錄操作");
System.out.println("登錄成功");
}
}
// 支付系統(tǒng)
public class PayManager {
public void pay(int momey) {
System.out.println("生成訂單信息");
System.out.println("選擇支付方式");
System.out.println("支付成功:" + momey + "元");
}
}
3、客戶端測試:
private void test() {
// 這里是游戲研發(fā),通過調(diào)用login()和pay()就能調(diào)起登錄和支付,無需關(guān)心支付是使用支付寶還是威信等,這是游戲SDK里面去做的事。
GameSdk gameSdk = new GameSdk();
gameSdk.login();
gameSdk.pay(6);
}
輸出結(jié)果:
打開登錄界面
進(jìn)行登錄操作
登錄成功
生成訂單信息
選擇支付方式
支付成功:6元
模式總結(jié)
應(yīng)用場景
- 為一個復(fù)雜的子系統(tǒng)提供一個簡單接口,對外隱藏子系統(tǒng)的具體實現(xiàn)、隔離變化。
- 使用外觀模式可以將一個子系統(tǒng)和使用它的客戶端以及其它的子系統(tǒng)分離開來,這就提高了子系統(tǒng)的獨立性和可移植性。
- 在構(gòu)建一個層次化結(jié)構(gòu)的時候,可以使用外觀模式定義每一個層次對外交互的接口。這樣,層與層之間只需要通過外觀進(jìn)行通信,從而簡化層與層之間的依賴關(guān)系。
優(yōu)點
- 降低了客戶端與子系統(tǒng)類的耦合度,實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系。
- 外觀類對子系統(tǒng)的接口封裝,使得系統(tǒng)更易于使用。
- 提高靈活性,不管子系統(tǒng)如何變化,只要不影響門面對象,就可以自由修改。
缺點
- 增加新的子系統(tǒng)可能需要修改外觀類的源代碼,違背了“開閉原則”。
- 所有子系統(tǒng)的功能都通過一個接口來提供,這個接口可能會變得很復(fù)雜。
Android中的源碼分析
外觀模式在Android中應(yīng)用也非常廣泛,比如Context類,里面封裝了很多方法,還是以startActivity()方法為例。實際上startActivity()是通過ActivityManagerService來實現(xiàn)的,ActivityManagerService我們應(yīng)該都有耳聞,但是實際開發(fā)中一般都用不到,通過封裝的方式,Context類隱藏了這些細(xì)節(jié),我們只要簡單調(diào)個方法就可以啟動一個新的Activity。
這就是外觀模式在Android應(yīng)用的例子了。當(dāng)然這種應(yīng)用比比皆是,我們平時開發(fā)也經(jīng)常用的到。