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