Java設(shè)計(jì)模式之外觀模式示例詳解
定義
外觀模式為多個(gè)復(fù)雜的子系統(tǒng),提供了一個(gè)一致的界面,使得調(diào)用端只和這個(gè)接口發(fā)生調(diào)用,而無(wú)須關(guān)系這個(gè)子系統(tǒng)內(nèi)部的細(xì)節(jié)
案例
需求
看電影的時(shí)候需要進(jìn)行一系列的操作,比如打開(kāi)播放器,放下屏幕,打開(kāi)投影儀,打開(kāi)音響等,這個(gè)要怎么進(jìn)行管理呢
方案:外觀模式實(shí)現(xiàn)
定義播放器類(lèi)
public class Player { private static Player player = new Player(); private Player(){} public static Player getInstance(){ return player; } public void on(){ System.out.println("打開(kāi)播放器"); } public void off(){ System.out.println("關(guān)閉播放器"); } public void play(){ System.out.println("使用播放器播放電影"); } public void pause(){ System.out.println("暫停播放器"); } public void select(){ System.out.println("選擇喜歡的電影"); } }
定義投影儀類(lèi)
public class Projector { private static Projector projector = new Projector(); private Projector(){} public static Projector getInstance(){ return projector; } public void on(){ System.out.println("放下屏幕,打開(kāi)投影儀"); } public void off(){ System.out.println("關(guān)閉投影儀"); } public void focus(){ System.out.println("調(diào)節(jié)投影儀焦距"); } public void zoom(){ System.out.println("投影儀變焦"); } }
定義音響類(lèi)
public class Stereo { private static Stereo stereo = new Stereo(); private Stereo(){} public static Stereo getInstance(){ return stereo; } public void on(){ System.out.println("打開(kāi)音響"); } public void off(){ System.out.println("關(guān)閉音響"); } public void setVolume(){ System.out.println("調(diào)節(jié)音響音量"); } }
定義爆米花機(jī)類(lèi)
/** * 爆米花機(jī) * @author:liyajie * @createTime:2022/3/2 14:24 * @version:1.0 */ public class Popcorn { private static Popcorn popcorn = new Popcorn(); private Popcorn(){} public static Popcorn getInstance(){ return popcorn; } public void on(){ System.out.println("打開(kāi)爆米花機(jī)"); } public void off(){ System.out.println("關(guān)閉爆米花機(jī)"); } public void pop(){ System.out.println("制作爆米花"); } }
定義家庭影院外觀類(lèi)
public class HomeTheaterFacade { // 聚合各個(gè)子系統(tǒng) private Player player; private Popcorn popcorn; private Projector projector; private Stereo stereo; public HomeTheaterFacade(){ } // 全參構(gòu)造器 public HomeTheaterFacade(Player player, Popcorn popcorn,Projector projector,Stereo stereo){ this.player = player; this.popcorn = popcorn; this.projector = projector; this.stereo = stereo; } // 準(zhǔn)備階段 public void ready(){ popcorn.on(); player.on(); projector.on(); stereo.on(); } // 播放 public void play(){ player.select(); popcorn.pop(); projector.focus(); stereo.setVolume(); } // 結(jié)束 public void end(){ player.off(); popcorn.off(); projector.off(); stereo.off(); } }
定義測(cè)試類(lèi)
public class Test { public static void main(String[] args) { HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(Player.getInstance(),Popcorn.getInstance(),Projector.getInstance(),Stereo.getInstance()); homeTheaterFacade.ready(); homeTheaterFacade.play(); homeTheaterFacade.end(); } }
查看測(cè)試結(jié)果
分析
我們通過(guò)家庭影院外觀類(lèi)HomeTheaterFacade的ready,play,end方法操作了播放器,投影儀等的打開(kāi),關(guān)閉,對(duì)于家庭影院外觀類(lèi)來(lái)說(shuō),他是不需要知道播放器,投影儀等的打開(kāi),關(guān)閉具體是怎么樣實(shí)現(xiàn)的。在一定程度上實(shí)現(xiàn)了解耦,易維護(hù)和擴(kuò)展。
總結(jié)
優(yōu)勢(shì):
1.外觀模式對(duì)外屏蔽了子系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié)(安全性)
2.外觀模式降低了客戶端與子系統(tǒng)交互的復(fù)雜性,對(duì)客戶端和子系統(tǒng)進(jìn)行解耦合,子系統(tǒng)內(nèi)部的模塊更容易維護(hù)和擴(kuò)展
3.通過(guò)合理的使用外觀模式,可以幫助我們更好的劃分訪問(wèn)層次
使用場(chǎng)景
1.對(duì)分層的系統(tǒng)進(jìn)行構(gòu)建時(shí),使用外觀模式可以簡(jiǎn)化子系統(tǒng)之間的依賴關(guān)系
2.當(dāng)有一個(gè)復(fù)雜的系統(tǒng),里面有很多子系統(tǒng),有大量的操作,這時(shí)候可以使用外觀模式
3.當(dāng)客戶端與多個(gè)子系統(tǒng)之間存在很多耦合時(shí),引入外觀模式,可以將他們分離,提高子系統(tǒng)的獨(dú)立性和可移植性
以上就是Java設(shè)計(jì)模式之外觀模式示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java外觀模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot深入探究四種靜態(tài)資源訪問(wèn)的方式
這一節(jié)詳細(xì)的學(xué)習(xí)一下SpringBoot的靜態(tài)資源訪問(wèn)相關(guān)的知識(shí)點(diǎn)。像這樣的知識(shí)點(diǎn)還挺多,比如SpringBoot2的Junit單元測(cè)試等等。本章我們來(lái)了解靜態(tài)資源訪問(wèn)的四種方式2022-05-05一文探索Apache HttpClient如何設(shè)定超時(shí)時(shí)間
Apache HttpClient是一個(gè)流行的Java庫(kù),用于發(fā)送HTTP請(qǐng)求,這篇文章主要為大家介紹了Apache HttpClient如何設(shè)定超時(shí)時(shí)間,感興趣的小伙伴可以學(xué)習(xí)一下2023-10-10Java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)的示例代碼
泛型是JAVA重要的特性,使用泛型編程,可以使代碼復(fù)用率提高。本文將利用泛型實(shí)現(xiàn)簡(jiǎn)單的棧結(jié)構(gòu),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08java圖形化界面實(shí)現(xiàn)簡(jiǎn)單混合運(yùn)算計(jì)算器的示例代碼
這篇文章主要介紹了java圖形化界面實(shí)現(xiàn)簡(jiǎn)單混合運(yùn)算計(jì)算器的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Hadoop+HBase+ZooKeeper分布式集群環(huán)境搭建步驟
這篇文章主要介紹了Hadoop+HBase+ZooKeeper分布式集群環(huán)境搭建,集群環(huán)境至少需要3個(gè)節(jié)點(diǎn),1個(gè)Master,2個(gè)Slave,節(jié)點(diǎn)之間局域網(wǎng)連接,可以相互ping通,本文通過(guò)實(shí)例給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04SpringBoot搭建多數(shù)據(jù)源的實(shí)現(xiàn)方法
說(shuō)起多數(shù)據(jù)源,一般都來(lái)解決那些問(wèn)題呢,主從模式或者業(yè)務(wù)比較復(fù)雜需要連接不同的分庫(kù)來(lái)支持業(yè)務(wù)。本文主要介紹了SpringBoot搭建多數(shù)據(jù)源的實(shí)現(xiàn)方法,感興趣的可以了解一下,感興趣的可以額了解一下2021-12-12