设计模式之适配器与外观模式(二)
好了,通過上次的學(xué)習(xí),我們已經(jīng)知道適配器模式是如何將一個類的接口轉(zhuǎn)換成另一個符合客戶期望的接口。同時也知道在Java中要做到這一點,必須將一個不兼容接口的對象包裝起來,變成兼容的對象。
我們現(xiàn)在要看一個改變接口的新模式,但是它改變接口的原因是為了簡化接口。這個模式被巧妙地命名為外觀模式(Facade-Pattern),之所以這么稱呼,是因為它將一個或數(shù)個類的復(fù)雜的一切都隱藏在背后,只顯露出一個干凈美好的外觀。
繁瑣的看電影步驟
還記得我們之前說過的命令模式中,一個遙控器能控制很多家電的過程吧。簡單的開關(guān)我們都會,復(fù)雜的模式,就比較麻煩,比如看電影的步驟:
看一個電影,真的是如此繁瑣。而且看完電影之后,還得過去把這些步驟都關(guān)閉。是用你的家庭影院竟然變得如此復(fù)雜!讓我們看看外觀模式如何解決這團(tuán)混亂,好讓你輕松享受。
燈光、相機(jī)、外觀!
你需要的正是一個外觀:有了外觀模式,通過實現(xiàn)一個提供更合理的接口的外觀類,你可以將一個復(fù)雜的子系統(tǒng)變得容易使用。
構(gòu)造家庭影院外觀
好了,那接下來就到實戰(zhàn)階段啦。
第一步是使用組合讓外觀能夠訪問子系統(tǒng)中所有的組件
public class HomeTheaterFacade {Amplifier amp;Tuner tuner;DvdPlayer dvd;CdPlayer cd;Projector projector;TheaterLights lights;Screen screen;PopcornPopper popper;public HomeTheaterFacade(Amplifier amp, Tuner tuner, DvdPlayer dvd, CdPlayer cd, Projector projector, Screen screen,TheaterLights lights,PopcornPopper popper) {this.amp = amp;this.tuner = tuner;this.dvd = dvd;this.cd = cd;this.projector = projector;this.screen = screen;this.lights = lights;this.popper = popper;}// 將我們之前手動進(jìn)行的每項任務(wù)依次處理。這里每項任務(wù)都是委托子系統(tǒng)中相應(yīng)的組件處理的public void watchMovie(String movie) {System.out.println("Get ready to watch a 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 void endMovie() {System.out.println("Shutting movie theater down...");popper.off();lights.on();screen.up();projector.off();amp.off();dvd.stop();dvd.eject();dvd.off();} } 復(fù)制代碼有了這個基礎(chǔ),后面觀賞電影就變得簡單了。
public class HomeTheaterTestDrive {public static void main(String[] args) {Amplifier amp = new Amplifier("Top-O-Line Amplifier");Tuner tuner = new Tuner("Top-O-Line AM/FM Tuner", amp);DvdPlayer dvd = new DvdPlayer("Top-O-Line DVD Player", amp);CdPlayer cd = new CdPlayer("Top-O-Line CD Player", amp);Projector projector = new Projector("Top-O-Line Projector", dvd);TheaterLights lights = new TheaterLights("Theater Ceiling Lights");Screen screen = new Screen("Theater Screen");PopcornPopper popper = new PopcornPopper("Popcorn Popper");// 根據(jù)子系統(tǒng)所有的組件來實例化外觀HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, tuner, dvd, cd, projector, screen, lights, popper);// 使用簡化的接口,并開啟電影,然后關(guān)閉電影homeTheater.watchMovie("Raiders of the Lost Ark");homeTheater.endMovie();} } 復(fù)制代碼就這樣,我們完成了外觀模式的處理。當(dāng)你使用完,是不是覺得很簡單了呢。
定義外觀模式
想要用外觀模式,我們創(chuàng)建了一個接口簡化而統(tǒng)一的類,用來包裝子系統(tǒng)中一個或多個復(fù)雜的類。外觀模式相當(dāng)直接,很容易理解,這方面和許多其他的模式不太一樣。但這并不會降低它的威力:外觀模式允許我們讓客戶和子系統(tǒng)之間避免緊耦合。而且外觀模式也幫我們遵循一個新的面向?qū)ο笤瓌t。
外觀模式提供了一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀定義了一個高層接口,讓子系統(tǒng)更容易使用。
最少知識原則:只和你的密友談話。這個原則系統(tǒng)我們在設(shè)計中,不要讓太多的類耦合在一起,免得修改系統(tǒng)中的一部分,會影響到其他部分。如果許多類之間相互依賴,那么這個系統(tǒng)就會變成一個易碎的系統(tǒng),他需要花許多成本維護(hù),也會因為太復(fù)雜而不容易被其他人了解。
我們來做一個對比大家就知道啦
// 不采用這個原則,我們需要調(diào)用兩次方法才能獲取到最終的信息 public float getTemp() {Thermometer thermometer = station.getThermometer();return thermometer.getTemperature(); }// 采用這個原則,我們加進(jìn)一個方法,這樣就可以減少我們所依賴的類的數(shù)目 public float getTemp() {return station.getTemperature(); } 復(fù)制代碼設(shè)計箱內(nèi)的工具
因為這次學(xué)習(xí)的內(nèi)容比較簡單,我就在這篇里進(jìn)行總結(jié)了。
-
OO基礎(chǔ)
抽象、封裝、繼承、多態(tài)
-
OO原則
封裝變化
多用組合,少用繼承
針對接口編程,不針對實現(xiàn)編程
為交互對象之間的松耦合設(shè)計而努力
依賴抽象,不要依賴具體類
類應(yīng)該對擴(kuò)展開放,對修改關(guān)閉
只和朋友交談
-
OO模式
『策略模式』、『觀察者模式』、『裝飾者模式』、『抽象工廠模式』、『工廠方法模式』、『單例模式』、『命令模式』
『適配器模式』將一個類的接口,轉(zhuǎn)換成客戶期望另一個接口。適配器讓原本不兼容的類合作無間。
『外觀模式』提供了一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀定義了一個高層接口,讓子系統(tǒng)更容易使用。
這次學(xué)習(xí)的適配器和外觀,雖然篇幅不多,但是在平常寫代碼的過程中還是經(jīng)常使用的,尤其是適配器模式,你們覺得呢?所以,這一塊還得鞏固好,這樣對于后面編寫代碼,理解代碼的根源很有幫助的哦。下次,我們開啟模板方式模式之旅。
PS:小編在介紹適配器模式的時候,只舉例說明了對象適配器。其實還有一個類適配器,但是那個是需要用到多重繼承的,考慮到Java沒有實際場景,這里就略過了。感興趣的朋友可以繼續(xù)深入研究下。
愛生活,愛學(xué)習(xí),愛感悟,愛挨踢
轉(zhuǎn)載于:https://juejin.im/post/5ce89c75e51d4555fc1acc14
總結(jié)
以上是生活随笔為你收集整理的设计模式之适配器与外观模式(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tune声场测试软件_(整理)Smaar
- 下一篇: 设计模式java 模板模式_设计模式-模