Java常用設計模式————外觀模式

引言

外觀模式(Facade Pattern),又叫“過程模式”。外觀模式爲子系統中的一組接口提供一個一致的入口,此模式定義了一個高層接口,這個接口使得這一組子系統更加易用。

一、案例分析

生活中有很多類似的案例,比如駕駛員駕駛汽車,只需要操作方向盤、檔杆、離合器、剎車、油門這幾個主要接口,而汽車內部的一組操作則不需要駕駛員考慮,比如駕駛員踩剎車後,車子就會停下來,而系統內部實際上通過“剎車”這一接口,經過一系列的機械傳動到達剎車片。

再比如,一套豪華的家庭影院,用戶只需要簡單點擊遙控器上的“開始”按鈕,一系列諸如:關閉窗簾、打開投影儀、打開音響、放下屏幕就都可以自動完成。

二、外觀模式類圖

以家庭影院案例爲參考,遙控器或操作界面提供了統一的外觀接口,接口組裝了一系列子系統運行動作:

三、代碼實現

窗簾子系統:

public class Curtain {
	public void up() {
		System.out.println("窗簾升起...");
	}
	public void down() {
		System.out.println("窗簾降下...");
	}
}

音響子系統:

public class Sound {
	public void on() {
		System.out.println("打開音響...");
	}
	public void off() {
		System.out.println("關閉音響...");
	}
}

播放器:

public class Player {
	public void play() {
		System.out.println("開始播放...");
	}
	public void pause() {
		System.out.println("暫停播放...");
	}
	public void stop() {
		System.out.println("退出播放器...");
	}
}

投影儀子系統:

public class Projector {
	private Player player;
	
	public void init(Player player) {
		this.player = player;
	}
	public void on() {
		System.out.println("打開投影機...");
		player.play();
	}
	public void off() {
		player.stop();
		System.out.println("關閉投影機...");
	}
}

家庭影院外觀類:

public class HomeTheatre {
	private Curtain curtain;
	private Projector projector;
	private Player player;
	private Sound sound;

	public HomeTheatre(Curtain curtain, Projector projector, Player player, Sound sound) {
		super();
		this.curtain = curtain;
		this.projector = projector;
		this.player = player;
		this.sound = sound;
	}

	/** 一鍵啓動*/
	public void start() {
		curtain.down();
		projector.init(player);
		sound.on();
		projector.on();
	}
	/** 暫停播放*/
	public void pause() {
		player.pause();
	}
	/** 退出家庭影院*/
	public void exitAll() {
		curtain.up();
		sound.off();
		projector.off();
	}
}

Client調用端:

public class Client {

	public static void main(String[] args) {
		HomeTheatre homeTheatre = new HomeTheatre(new Curtain(), new Projector(), new Player(), new Sound());
		System.out.println("-----打開家庭影院------");
		homeTheatre.start();
		System.out.println("-----暫停播放------");
		homeTheatre.pause();
		System.out.println("-----退出家庭影院------");
		homeTheatre.exitAll();
	}
}

執行結果:

-----打開家庭影院------
窗簾降下...
打開音響...
打開投影機...
開始播放...
-----暫停播放------
暫停播放...
-----退出家庭影院------
窗簾升起...
關閉音響...
退出播放器...
關閉投影機...

總結

外觀模式就是把一部分基礎功能一致的代碼抽離到單獨的子模塊中,然後在外觀類中聚合使用;或者在設計之初就將業務流設計爲多個子系統組合的流水線式,無論哪種方式,外觀模式都會讓代碼的執行邏輯一目瞭然。

如果過去只是把一堆業務邏輯全部放到一個類中去寫,那這隻能算得上是面向過程編程。如果你能夠把一些代碼提出到多個類中去然後依賴它們的話,就成了高大上的外觀模式。

外觀模式雖然極容易理解,但是它並不符合開閉原則,也不要盲目使用。

在Spring 容器環境的初始化階段就用到了外觀模式,一步一步地執行各個子系統的初始化工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章