在進入外觀模式的細節以前,讓咱們看一個風行全球的熱潮:創建本身的家庭影院。java
經過一番比較,你組裝了一套殺手級的系統,內涵DVD播放器、投影機、自動屏幕、環繞立體聲,甚至還有爆米花機。ide
你花了好幾個星期佈線、掛上投影機、連接全部的裝置並進行微調。如今,你準備開始享受一部電影……學習
挑選一部DVD影片,放鬆,準備開始感覺電影的魔幻魅力。哎呀!忘了一件事:想看電影,必需要先執行一些任務:this
讓咱們將這些任務寫成類和方法的調用:spa
public class Client { public static void main(String[] args) { // 打開爆米花機 Popper popper = new Popper(); popper.on(); popper.pop(); // 調暗燈光 Lights lights = new Lights(); lights.dim(10); // 設置屏幕 Screen screen = new Screen(); screen.down(); // 設置投影機 Projector projector = new Projector(); projector.on(); projector.setInput("Dvd"); projector.wideScreenMode(); // 設置功放 Amp amp = new Amp(); amp.on(); amp.setDvd(); amp.setSurroundSound(); amp.setVolume(5); // 開始看電影 Dvd dvd = new Dvd(); dvd.play(); } }
整個一個調用過程涉及到了六個類,但還不止如此,看完後還須要把一切都關掉……若是想要切換到CD或者聽廣播怎麼辦?若是要升級系統,可能還須要從新學習一下稍微不一樣的操做過程…….net
使用你的家庭影院居然變得如此複雜!讓咱們看看外觀模式如何解決這團混亂,好讓你能輕鬆地享受電影……設計
你須要的正是一個外觀,有了外觀模式,經過實現一個提供更合理的接口的外觀類,你能夠將一個複雜的子系統變得容易使用。若是你須要複雜的子系統的強大威力,別擔憂,仍是可使用原來的複雜接口的,但若是你須要的是一個方便使用的接口,那就使用外觀模式吧!code
讓咱們看看外觀模式如何運做:對象
package cn.net.bysoft.facade; public class HomeTheaterFacade { Popper popper; Lights lights; Screen screen; Projector projector; Amp amp; Dvd dvd; public HomeTheaterFacade(Popper popper, Lights lights, Screen screen, Projector projector, Amp amp, Dvd dvd) { this.popper = popper; this.lights = lights; this.screen = screen; this.projector = projector; this.amp = amp; this.dvd = dvd; } public void watchMovie() { popper.on(); popper.pop(); lights.dim(10); screen.down(); projector.on(); projector.setInput("Dvd"); projector.wideScreenMode(); amp.on(); amp.setDvd(); amp.setSurroundSound(); amp.setVolume(5); dvd.play(); } }
package cn.net.bysoft.facade; public class Client { public static void main(String[] args) { Popper popper = new Popper(); Lights lights = new Lights(); Screen screen = new Screen(); Projector projector = new Projector(); Amp amp = new Amp(); Dvd dvd = new Dvd(); HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(popper, lights, screen, projector, amp, dvd); homeTheaterFacade.watchMovie(); } }
所有內容就是這樣,如今又學會了一個模式,經過這個模式引導出了一個新的設計原則。接口
最少知識(Least Knowledge) 原則告訴咱們要減小對象之間的交互,只留下幾個「密友」。這個原則一般是這麼說的:
最少知識原則:之和你的密友談話。
這是說,當你正在設計一個系統,不論是任何對象,你都要注意它所交互的類有哪些,並注意它和這些類是如何交互的。
這個原則但願咱們在設計中,不要讓太多的類耦合在一塊兒,省得修改系統中一部分,會影響到其餘部分。若是許多類之間相互依賴,那麼這個系統就會變成一個易碎的系統,它須要花許多成本維護,也會由於太複雜而不容易被其餘人瞭解。
究竟要怎麼才能避免這樣呢?這個原則提供了一些方針,就職何對象而言,在該對象的方法內,咱們只應該調用屬於一下範圍的方法:
前三條是說,若是某對象是調用其餘的方法的返回結果,不要調用該對象的方法;
最後一條是說,把「組件」想成是被實例變量所引用的任何對象,換句話說,把這想象成是Has-A的關係。
例如:
// 未使用最少知識原則 public float getTemp() { Thermometer thermometer = station.getThermometer(); return thermometer.getTemperature(); } // 使用最少知識原則 public float getTemp() { return station.getTemperature(); }
上面的代碼的第一個方法沒有使用最少知識原則,首先從氣象站取得了溫度計對象,而後再從溫度計對象取得了溫度,getTemp()方法與兩個對象在打交道。
第二個方法使用了最少知識原則,咱們能夠在氣象站中加入一個getTemperature()方法得到溫度,讓getTemp()方法只與氣象站一個對象打交道。
以上就是外觀模式的內容。