HeadFirst設計模式(八) - 外觀模式

甜蜜的家庭影院

    在進入外觀模式的細節以前,讓咱們看一個風行全球的熱潮:創建本身的家庭影院。java

    經過一番比較,你組裝了一套殺手級的系統,內涵DVD播放器、投影機、自動屏幕、環繞立體聲,甚至還有爆米花機。ide

    你花了好幾個星期佈線、掛上投影機、連接全部的裝置並進行微調。如今,你準備開始享受一部電影……學習

觀賞電影(用困難的方式)

    挑選一部DVD影片,放鬆,準備開始感覺電影的魔幻魅力。哎呀!忘了一件事:想看電影,必需要先執行一些任務:this

  • 打開爆米花機
  • 開始爆米花
  • 將燈光調暗
  • 放下屏幕
  • 打開投影機
  • 將投影機的輸入切換到DVD
  • 將投影機設置到寬屏模式
  • 打開功放
  • 將功放的輸入設置爲DVD
  • 將功放設置爲環繞立體聲
  • 將功放音量設置到百分之五十
  • 打開DVD播放器
  • 開始播放DVD

    讓咱們將這些任務寫成類和方法的調用: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()方法只與氣象站一個對象打交道。

    以上就是外觀模式的內容。

相關文章
相關標籤/搜索