定義:
要求一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信必須通過(guò)一個(gè)統(tǒng)一的對(duì)象進(jìn)行。此模式提供一個(gè)高層的接口,使得子系統(tǒng)更易于使用害捕。
外觀模式也被稱為門面模式。無(wú)論做SDK還是封裝API闷畸,大多會(huì)用到外觀模式尝盼,通過(guò)一個(gè)外觀類使得整個(gè)系統(tǒng)結(jié)構(gòu)只有一個(gè)統(tǒng)一的高層接口,降低用戶使用成本佑菩。
模式所涉及的角色有:
Client : 客戶端程序盾沫。
Facade : 對(duì)外的統(tǒng)一入口,即外觀對(duì)象。
SubSystem : 子系統(tǒng)或者子服務(wù)等等殿漠。
如電視機(jī)遙控板例子:
/**
* 頻道系統(tǒng)
*/
public class ChannelSystem {
public void nextChannel() {
System.out.println("下一個(gè)頻道");
}
public void prevChannel() {
System.out.println("上一頻道");
}
}
/**
* 音量系統(tǒng)
*/
public class VoiceSystem {
public void turnUp() {
System.out.println("音量增大");
}
public void turnDown() {
System.out.println("音量減小");
}
}
/**
* 電源系統(tǒng)
*/
public class PowerSystem {
public void powerOn() {
System.out.println("開機(jī)");
}
public void powerOff() {
System.out.println("關(guān)機(jī)");
}
}
/**
* 外觀類--遙控板
*/
public class TvController {
private PowerSystem mPowerSystem = new PowerSystem();
private VoiceSystem mVoiceSystem = new VoiceSystem();
private ChannelSystem mChannelSystem = new ChannelSystem();
public void powerOn() {
mPowerSystem.powerOn();
}
public void powerOff() {
mPowerSystem.powerOff();
}
public void turnUp() {
mVoiceSystem.turnUp();
}
public void turnDown() {
mVoiceSystem.turnDown();
}
public void nextChannel() {
mChannelSystem.nextChannel();
}
public void prevChannel() {
mChannelSystem.prevChannel();
}
}
優(yōu)點(diǎn):
對(duì)客戶程序隱藏子系統(tǒng)細(xì)節(jié)赴精,因而減少了客戶對(duì)于子系統(tǒng)的耦合,能夠擁抱變化绞幌;
外觀類對(duì)子系統(tǒng)的接口封裝蕾哟,使得系統(tǒng)更易于使用;
更好的劃分訪問層次莲蜘,通過(guò)合理使用Facade渐苏,可以幫助我們更好地劃分訪問的層次。有些方法是對(duì)系統(tǒng)外的菇夸,有些方法是系統(tǒng)內(nèi)部使用的琼富。把需要暴露給外部的功能集中到外觀類中,這樣既方便客戶端使用庄新,也很好地隱藏了內(nèi)部的細(xì)節(jié)鞠眉。
缺點(diǎn):
外觀類接口膨脹,由于子系統(tǒng)的接口都由外觀類統(tǒng)一對(duì)外暴露择诈,使得外觀類的 API 接口較多械蹋,在一定程度上增加了用戶使用成本;
外觀類沒有遵循開閉原則(對(duì)擴(kuò)展開放羞芍,對(duì)修改關(guān)閉)哗戈,當(dāng)業(yè)務(wù)出現(xiàn)變更時(shí),可能需要直接修改外觀類荷科。