設計模式(八)—— 外觀模式
阿新 • • 發佈:2018-12-12
一、含義
提供一個統一的介面,用來訪問子系統中的一群介面。外觀定義了一個高層介面,讓子系統更容易使用。也就是當客戶需要呼叫程式多個介面完成一件事情時,那麼就可以多個介面呼叫的方法,封裝在一個接口裡提供給客戶使用。
二、要點
1.當需要簡化並同意一個很大的介面或者一群複雜的介面時,使用外觀模式。
2.外觀模式將客戶從一個複雜的子系統中解耦。
3.實現一個外觀模式,需要將子系統組合進外觀中,然後將工作委託給子系統執行。
三、實戰分析外觀模式
首先來看一下外觀模式的類圖:
當週末來的時候,一個在家看一場電影,是非常爽的一件事,現在努力敲程式碼就是為了,可以在搞一個私人小影院,簡直不要太爽,現在可以先來定製一個看電影的流程:開啟爆米花機(看電影不吃點什麼,感覺浪費了看電影的時間)——開始爆米花——將房間燈光調暗——放下螢幕——開啟投影機——將投影機設定好投影模式——開啟功放——將功放的輸入設定為DVD——將功放設定為環繞立體聲——將功放的音量調到適中——開啟DVD播放器——開始播放DVD。程式碼演示如下:
//開啟爆米花機 popper.on(); popper.pop(); //調暗燈光 lights.dim(10); //放下螢幕 screen.down(); //開啟投影機 projector.on(); projector.setInput(dvd); projector.wideScreenMode(); //設定功放 amp.on(); amp.setDvd(dvd); amp.setSurroundSound(); amp.setVolume(5); //開啟DVD dvd.on(); dvd.play(movie);
看一場電影要涉及到這麼多的類,對我來說看個電影真不容易!那有沒有方法可以簡化這些麻煩的操作呢,要是有一鍵操作就好了,我只需要一個遙控器,按一下,就可以播放電影,這個時候,就可以使用外觀模式了:
public class TheaterFacadeControl { Amplifier amp; Tuner tuner; DvdPlayer dvdPlayer; CdPlayer cdPlayer; Projector projector; TheaterLights lights; Screen screen; PopcornPopper popper; public TheaterFacadeControl(Amplifier amp, Tuner tuner, DvdPlayer dvdPlayer, CdPlayer cdPlayer, Projector projector, TheaterLights lights, Screen screen, PopcornPopper popper) { this.amp = amp; this.tuner = tuner; this.dvdPlayer = dvdPlayer; this.cdPlayer = cdPlayer; this.projector = projector; this.lights = lights; this.screen = screen; this.popper = popper; } //只需遙控器按一下,我就可以看電影了,美滋滋 public void watchMovie(String movie) { popper.on(); popper.pop(); lights.dim(10); screen.down(); projector.on(); projector.wideScreenMode(); amp.on(); amp.setDvd(dvd); amp.setSurroundSound(); amp.setVolume(5); dvd.on(); dvd.play(movie); }
然後編寫測試類,測試一下:
public class Test2 {
public static void main(String[] args) {
//例項化元件
Amplifier amp = new Amplifier();
Tuner tuner = new Tuner();
DvdPlayer dvd = new DvdPlayer();
Projector projector = new Projector();
TheaterLights lights = new TheaterLights();
Screen screen = new Screen();
PopcornPopper popper = new PopcornPopper();
TheaterFacadeControl theater = new TheaterFacadeControl(amp,tuner,dvd,projector,lights,screen,popper);
//使用簡化後的遙控器看電影
theater.watchMovie("喜劇之王");
}
}
測試結果如下:
PopcornPopper on
PopcornPopper pop
TheaterLights dim10
Screen down
Projector on
Projector wideScreenMode
Amplifier on
Amplifier setDvd
Amplifier setSurroundSound
Amplifier setVolume 5
DvdPlayer on
DvdPlayer play喜劇之王
以後看電影就方便多了。