Java 设计模式之外观模式
一、了解外觀模式
1.1 什么是外觀模式
外觀模式 (Facade Pattern) 提供了一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀定義了一個高層接口,讓子系統(tǒng)更容易使用。
想要使用外觀模式,我們需要創(chuàng)建一個接口來簡化和統(tǒng)一包裝一個子系統(tǒng)的一個或多個類。外觀模式允許我們讓客戶和子系統(tǒng)之間避免緊耦合。
1.2 外觀模式的組成結(jié)構(gòu)
- 客戶 (Client):通過調(diào)用 Facede 來完成要實現(xiàn)的功能。
- 外觀 (Facade):外觀模式的核心。它被客戶角色調(diào)用,它熟悉子系統(tǒng)的功能。內(nèi)部根據(jù)客戶角色的需求預(yù)定了幾種功能的組合。
- 復(fù)雜的子系統(tǒng):實現(xiàn)了子系統(tǒng)的功能。它對客戶角色和 Facade 是未知的。它內(nèi)部可以有系統(tǒng)內(nèi)的相互交互,也可以由供外界調(diào)用的接口。
1.3 外觀模式 UML 圖解
1.4 外觀模式適用場景
- 設(shè)計初期階段,應(yīng)該有意識的將不同層分離,層與層之間建立外觀模式。
- 開發(fā)階段,子系統(tǒng)越來越復(fù)雜,增加外觀模式提供一個簡單的調(diào)用接口。
- 維護一個大型遺留系統(tǒng)的時候,可能這個系統(tǒng)已經(jīng)非常難以維護和擴展,但又包含非常重要的功能,為其開發(fā)一個外觀類,以便新系統(tǒng)與其交互。
二、外觀模式具體應(yīng)用
2.1 問題描述
看電影:大部分人應(yīng)該都喜歡看電影,我們來想一下我們?nèi)ル娪霸嚎措娪?#xff0c;從坐下座位后都是需要哪些步驟。首先在電影沒有正式放映之前會先放一會兒廣告;然后將燈光調(diào)暗;接著后臺播放器播放對應(yīng)的 DVD,電影正式播放;當電影播放完畢后就是將燈光調(diào)回明亮;關(guān)閉播放器。
2.2 偽代碼模擬過程
ads.on(); // 電影未開始之前,放映一會兒廣告ads.close(); // 電影快開始時,關(guān)閉廣告light.dim(10); // 將燈光的亮度調(diào)到 10%dvdPlayer.on(dvd); // 播放器播放對應(yīng)的 DVDlight.dim(100); // 電影結(jié)束后,將燈光亮度調(diào)到 100%dvdPlayer.close(); // 關(guān)閉播放器上面這種方式,用代碼模擬電影院的步驟變得很復(fù)雜。我們可以使用外觀模式,把這些復(fù)雜的步驟封裝起來,只對外提供簡單的方法。
2.3 外觀模式設(shè)計圖
2.4 外觀模式代碼實現(xiàn)
子系統(tǒng)廣告 Advertisement 類
package com.jas.facade;public class Advertisement {void on(){System.out.println("現(xiàn)在開始播放廣告,電影即將開始播放!");}void close(){System.out.println("廣告播放結(jié)束!");} }子系統(tǒng)燈光 Light 類
package com.jas.facade;public class Light {void dim(int brightness){System.out.println("調(diào)整燈光亮度為:" + brightness + "%!");} }子系統(tǒng)播放器 DVDPlayer 類
package com.jas.facade;public class DVDPlayer {void on(String dvd){System.out.println("現(xiàn)在開始播放電影,觀看的電影是" + dvd + "!");}void close(){System.out.println("電影播放結(jié)束,請大家按秩序退場,關(guān)閉播放器!");} }外觀 TheaterFacade 類
package com.jas.facade;public class TheaterFacade {Advertisement ads;Light light;DVDPlayer dvdPlayer;public TheaterFacade(Advertisement ads, Light light, DVDPlayer dvdPlayer){this.ads = ads;this.light = light;this.dvdPlayer = dvdPlayer;}void watchMovie(String dvd){ads.on();ads.close();light.dim(10);dvdPlayer.on(dvd);}void endMovie(){light.dim(100);dvdPlayer.close();} }客戶類
package com.jas.facade;public class TheaterTestDrive {public static void main(String[] args) {Advertisement ads = new Advertisement();Light light = new Light();DVDPlayer dvdPlayer = new DVDPlayer();TheaterFacade facade = new TheaterFacade(ads, light, dvdPlayer);facade.watchMovie("復(fù)仇者聯(lián)盟×");facade.endMovie();} }/*** 輸出* 現(xiàn)在開始播放廣告,電影即將開始播放!* 廣告播放結(jié)束!* 調(diào)整燈光亮度為:10%!* 現(xiàn)在開始播放電影,觀看的電影是復(fù)仇者聯(lián)盟×!* 調(diào)整燈光亮度為:100%!* 電影播放結(jié)束,請大家按秩序退場,關(guān)閉播放器!*/三、 外觀模式總結(jié)
3.1 外觀模式優(yōu)點
- 實現(xiàn)了子系統(tǒng)與客戶端之間的松耦合關(guān)系。
- 客戶端屏蔽了子系統(tǒng)組件,減少了客戶端所需處理的對象數(shù)目,并使得子系統(tǒng)使用起來更加容易。
3.2 外觀模式知識點總結(jié)
- 當需要簡化并統(tǒng)一一個很大的接口或者一個復(fù)雜的接口時,可以使用外觀。
- 外觀將客戶從一個復(fù)雜的子系統(tǒng)中解耦。
- 實現(xiàn)一個外觀,需要將子系統(tǒng)組合進外觀中,然后具體的工作委托給子系統(tǒng)執(zhí)行。
PS:點擊了解更多設(shè)計模式 http://blog.csdn.net/codejas/article/details/79236013
參考文獻
《Head First 設(shè)計模式》
總結(jié)
以上是生活随笔為你收集整理的Java 设计模式之外观模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: m开头的姓氏
- 下一篇: 毕业生在武汉自如租房有补贴吗?