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

分析
我們通過家庭影院外觀類HomeTheaterFacade的ready,play,end方法操作了播放器,投影儀等的打開,關(guān)閉,對于家庭影院外觀類來說,他是不需要知道播放器,投影儀等的打開,關(guān)閉具體是怎么樣實現(xiàn)的。在一定程度上實現(xiàn)了解耦,易維護和擴展。
總結(jié)
優(yōu)勢:
1.外觀模式對外屏蔽了子系統(tǒng)的實現(xiàn)細(xì)節(jié)(安全性)
2.外觀模式降低了客戶端與子系統(tǒng)交互的復(fù)雜性,對客戶端和子系統(tǒng)進(jìn)行解耦合,子系統(tǒng)內(nèi)部的模塊更容易維護和擴展
3.通過合理的使用外觀模式,可以幫助我們更好的劃分訪問層次
使用場景
1.對分層的系統(tǒng)進(jìn)行構(gòu)建時,使用外觀模式可以簡化子系統(tǒng)之間的依賴關(guān)系
2.當(dāng)有一個復(fù)雜的系統(tǒng),里面有很多子系統(tǒng),有大量的操作,這時候可以使用外觀模式
3.當(dāng)客戶端與多個子系統(tǒng)之間存在很多耦合時,引入外觀模式,可以將他們分離,提高子系統(tǒng)的獨立性和可移植性
以上就是Java設(shè)計模式之外觀模式示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java外觀模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java計算給定字符串中出現(xiàn)次數(shù)最多的字母和該字母出現(xiàn)次數(shù)的方法
這篇文章主要介紹了java計算給定字符串中出現(xiàn)次數(shù)最多的字母和該字母出現(xiàn)次數(shù)的方法,涉及java字符串的遍歷、轉(zhuǎn)換及運算相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
如何設(shè)置IDEA遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境并結(jié)合cpolar實現(xiàn)ssh遠(yuǎn)程開發(fā)(最新推薦)
本文主要介紹如何在IDEA中設(shè)置遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境,并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實現(xiàn)無公網(wǎng)遠(yuǎn)程連接,然后實現(xiàn)遠(yuǎn)程Linux環(huán)境進(jìn)行開發(fā),感興趣的朋友跟隨小編一起看看吧2024-03-03
dubbo如何設(shè)置連接zookeeper權(quán)限
這篇文章主要介紹了dubbo如何設(shè)置連接zookeeper權(quán)限問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
spring?boot?mybatis日志輸出到控制臺的方法實踐
在開發(fā)過程中我們往往需要打印出SQL語句,這樣就方便我們監(jiān)控問題,本文主要介紹了spring?boot?mybatis日志輸出到控制臺的方法實踐,具有一定的參考價值,感興趣的可以了解一下2024-05-05
JavaWeb JDBC + MySql 通訊錄實現(xiàn)簡單的增刪改查功能案例詳解
這篇文章主要介紹了JavaWeb JDBC + MySql 通訊錄實現(xiàn)簡單的增刪改查功能,結(jié)合具體案例形式詳細(xì)分析了JavaWeb JDBC + MySql數(shù)據(jù)庫連接、增刪改查等相關(guān)操作技巧與注意事項,需要的朋友可以參考下2019-08-08
通過AOP環(huán)繞通知如何實現(xiàn)事務(wù)控制
這篇文章主要介紹了通過AOP環(huán)繞通知如何實現(xiàn)事務(wù)控制的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

