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