Java設(shè)計(jì)模式之外觀模式示例詳解
定義
外觀模式為多個(gè)復(fù)雜的子系統(tǒng),提供了一個(gè)一致的界面,使得調(diào)用端只和這個(gè)接口發(fā)生調(diào)用,而無須關(guān)系這個(gè)子系統(tǒng)內(nèi)部的細(xì)節(jié)
案例
需求
看電影的時(shí)候需要進(jìn)行一系列的操作,比如打開播放器,放下屏幕,打開投影儀,打開音響等,這個(gè)要怎么進(jìn)行管理呢
方案:外觀模式實(shí)現(xiàn)
定義播放器類
public class Player {
private static Player player = new Player();
private Player(){}
public static Player getInstance(){
return player;
}
public void on(){
System.out.println("打開播放器");
}
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("選擇喜歡的電影");
}
}定義投影儀類
public class Projector {
private static Projector projector = new Projector();
private Projector(){}
public static Projector getInstance(){
return projector;
}
public void on(){
System.out.println("放下屏幕,打開投影儀");
}
public void off(){
System.out.println("關(guān)閉投影儀");
}
public void focus(){
System.out.println("調(diào)節(jié)投影儀焦距");
}
public void zoom(){
System.out.println("投影儀變焦");
}
}定義音響類
public class Stereo {
private static Stereo stereo = new Stereo();
private Stereo(){}
public static Stereo getInstance(){
return stereo;
}
public void on(){
System.out.println("打開音響");
}
public void off(){
System.out.println("關(guān)閉音響");
}
public void setVolume(){
System.out.println("調(diào)節(jié)音響音量");
}
}定義爆米花機(jī)類
/**
* 爆米花機(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("打開爆米花機(jī)");
}
public void off(){
System.out.println("關(guān)閉爆米花機(jī)");
}
public void pop(){
System.out.println("制作爆米花");
}
}定義家庭影院外觀類
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è)試類
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é)果

分析
我們通過家庭影院外觀類HomeTheaterFacade的ready,play,end方法操作了播放器,投影儀等的打開,關(guān)閉,對(duì)于家庭影院外觀類來說,他是不需要知道播放器,投影儀等的打開,關(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.通過合理的使用外觀模式,可以幫助我們更好的劃分訪問層次
使用場(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)文章
java計(jì)算給定字符串中出現(xiàn)次數(shù)最多的字母和該字母出現(xiàn)次數(shù)的方法
這篇文章主要介紹了java計(jì)算給定字符串中出現(xiàn)次數(shù)最多的字母和該字母出現(xiàn)次數(shù)的方法,涉及java字符串的遍歷、轉(zhuǎn)換及運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
如何設(shè)置IDEA遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境并結(jié)合cpolar實(shí)現(xiàn)ssh遠(yuǎn)程開發(fā)(最新推薦)
本文主要介紹如何在IDEA中設(shè)置遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境,并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)無公網(wǎng)遠(yuǎn)程連接,然后實(shí)現(xiàn)遠(yuǎn)程Linux環(huán)境進(jìn)行開發(fā),感興趣的朋友跟隨小編一起看看吧2024-03-03
dubbo如何設(shè)置連接zookeeper權(quán)限
這篇文章主要介紹了dubbo如何設(shè)置連接zookeeper權(quán)限問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
JAVA純代碼導(dǎo)出PDF文件實(shí)現(xiàn)方式
本文介紹了作者通過突發(fā)奇想發(fā)布了生成PDF的博客,最初,作者通過將Word文件轉(zhuǎn)換為PDF文件實(shí)現(xiàn)導(dǎo)出PDF功能,但效果不盡如人意,后來,作者嘗試直接生成PDF文件,并修復(fù)了生成PDF時(shí)出現(xiàn)的小瑕疵,通過導(dǎo)入依賴、下載接口和下載方法的實(shí)現(xiàn)2025-01-01
JAVA發(fā)送HTTP請(qǐng)求的四種方式總結(jié)
這篇文章主要給大家介紹了關(guān)于JAVA發(fā)送HTTP請(qǐng)求的多種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
spring?boot?mybatis日志輸出到控制臺(tái)的方法實(shí)踐
在開發(fā)過程中我們往往需要打印出SQL語(yǔ)句,這樣就方便我們監(jiān)控問題,本文主要介紹了spring?boot?mybatis日志輸出到控制臺(tái)的方法實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
JavaWeb JDBC + MySql 通訊錄實(shí)現(xiàn)簡(jiǎn)單的增刪改查功能案例詳解
這篇文章主要介紹了JavaWeb JDBC + MySql 通訊錄實(shí)現(xiàn)簡(jiǎn)單的增刪改查功能,結(jié)合具體案例形式詳細(xì)分析了JavaWeb JDBC + MySql數(shù)據(jù)庫(kù)連接、增刪改查等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-08-08
通過AOP環(huán)繞通知如何實(shí)現(xiàn)事務(wù)控制
這篇文章主要介紹了通過AOP環(huán)繞通知如何實(shí)現(xiàn)事務(wù)控制的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

