外觀模式主要目的是簡(jiǎn)化接口。
現(xiàn)在假設(shè)我們要組裝一個(gè)家庭影院系統(tǒng),系統(tǒng)內(nèi)含有DVD播放器,投影機(jī)、自動(dòng)屏幕、環(huán)繞立體聲等。
下面就是類圖
現(xiàn)在你想看電影,你得先執(zhí)行下面操作:
1,將燈光調(diào)暗,2.打開投影器 3.將投影機(jī)的輸入切換到DVD,4.將功能輸入設(shè)置為DVD。。。。。等等很多步驟,寫成方法就是下面這樣
popper.on();
popper.pop();
lights.dim();
screen,down();
projector.on();
amp.on();
看完電影后,你又得反著運(yùn)行上面代碼一遍進(jìn)行關(guān)閉動(dòng)作。
下面就通過外觀來改造一下了。
public class HomeTheaterFacade{
Amplifier amp;
Tuner tuner;
DvdPlayer dvd;
CdPlayer cd;
Projector projector;
public HomeTheaterFacade( Amplifier amp,Tuner tuner,DvdPlayer dvd,CdPlayer cd,Projector projector){
this.amp = amp;
this.tuner = tuner;
this.dvd = dvd;
this.cd =cd;
this.projector = projector;
}
//這是看電影方法
public void watchMovie(String movie){
popper.on();
popper.pop();
lights.dim();
screen,down();
projector.on();
amp.on();
}
public void endMovie(){
System.out.println("shutting movie theater down...");
popper.off();
lights.on();
screen.up();
//....等等
}
}
//現(xiàn)在看電影就很輕松了,只要調(diào)用HomeTheaterFacade的方法即可。
外觀模式定義:提供了一個(gè)統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口,外觀定義了一個(gè)高層接口,讓子系統(tǒng)更容易使用。
ps:設(shè)計(jì)原則 最少知識(shí)原則,只和你的密友談話。
最少知識(shí)原則具體說來就是在對(duì)象的方法內(nèi),我們應(yīng)該調(diào)用屬于以下范圍的方法:
1.改對(duì)象本身
2.被當(dāng)做方法參數(shù)而傳遞進(jìn)來的對(duì)象
3.此方法所創(chuàng)建或者實(shí)例化的任何對(duì)象
4.對(duì)象的任何組件。
//比如這是不采用這個(gè)原則的方法,這樣做的缺點(diǎn)是 :這個(gè)方法相當(dāng)于向另一個(gè)對(duì)象的子部分發(fā)請(qǐng)求(而增加我們直接認(rèn)識(shí)的對(duì)象數(shù)目)
public float getTemp(){
Thermometer thermometer = station.getThermomenter();
return thermomenter.getThemperature();
}
//這是采用這個(gè)原則的方法。采用這個(gè)原則也有缺點(diǎn):雖然減少了對(duì)象之間的依賴,降低軟件維護(hù)成本,但也會(huì)導(dǎo)致產(chǎn)生更多“包裝類”,以處理與其它組件的溝通,導(dǎo)致復(fù)雜度與開發(fā)時(shí)間,降低運(yùn)行時(shí)性能。
public float getTemp(){
return station.getThemperature();
}
總結(jié)就是各個(gè)設(shè)計(jì)模式目的: 裝飾者--不改變接口,但加入責(zé)任
適配器--將一個(gè)接口轉(zhuǎn)成另一個(gè)接口
外觀--讓接口更簡(jiǎn)單