Java設(shè)計模式之外觀模式示例詳解
定義
外觀模式為多個復(fù)雜的子系統(tǒng),提供了一個一致的界面,使得調(diào)用端只和這個接口發(fā)生調(diào)用,而無須關(guān)系這個子系統(tǒng)內(nèi)部的細節(jié)
案例
需求
看電影的時候需要進行一系列的操作,比如打開播放器,放下屏幕,打開投影儀,打開音響等,這個要怎么進行管理呢
方案:外觀模式實現(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;
}
// 準備階段
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)細節(jié)(安全性)
2.外觀模式降低了客戶端與子系統(tǒng)交互的復(fù)雜性,對客戶端和子系統(tǒng)進行解耦合,子系統(tǒng)內(nèi)部的模塊更容易維護和擴展
3.通過合理的使用外觀模式,可以幫助我們更好的劃分訪問層次
使用場景
1.對分層的系統(tǒng)進行構(gòu)建時,使用外觀模式可以簡化子系統(tǒng)之間的依賴關(guān)系
2.當(dāng)有一個復(fù)雜的系統(tǒng),里面有很多子系統(tǒng),有大量的操作,這時候可以使用外觀模式
3.當(dāng)客戶端與多個子系統(tǒng)之間存在很多耦合時,引入外觀模式,可以將他們分離,提高子系統(tǒng)的獨立性和可移植性
以上就是Java設(shè)計模式之外觀模式示例詳解的詳細內(nèi)容,更多關(guān)于Java外觀模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot深入探究四種靜態(tài)資源訪問的方式
這一節(jié)詳細的學(xué)習(xí)一下SpringBoot的靜態(tài)資源訪問相關(guān)的知識點。像這樣的知識點還挺多,比如SpringBoot2的Junit單元測試等等。本章我們來了解靜態(tài)資源訪問的四種方式2022-05-05
一文探索Apache HttpClient如何設(shè)定超時時間
Apache HttpClient是一個流行的Java庫,用于發(fā)送HTTP請求,這篇文章主要為大家介紹了Apache HttpClient如何設(shè)定超時時間,感興趣的小伙伴可以學(xué)習(xí)一下2023-10-10
Java使用泛型實現(xiàn)棧結(jié)構(gòu)的示例代碼
泛型是JAVA重要的特性,使用泛型編程,可以使代碼復(fù)用率提高。本文將利用泛型實現(xiàn)簡單的棧結(jié)構(gòu),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08
java圖形化界面實現(xiàn)簡單混合運算計算器的示例代碼
這篇文章主要介紹了java圖形化界面實現(xiàn)簡單混合運算計算器的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Hadoop+HBase+ZooKeeper分布式集群環(huán)境搭建步驟
這篇文章主要介紹了Hadoop+HBase+ZooKeeper分布式集群環(huán)境搭建,集群環(huán)境至少需要3個節(jié)點,1個Master,2個Slave,節(jié)點之間局域網(wǎng)連接,可以相互ping通,本文通過實例給大家介紹的非常詳細,需要的朋友可以參考下2022-04-04
SpringBoot搭建多數(shù)據(jù)源的實現(xiàn)方法
說起多數(shù)據(jù)源,一般都來解決那些問題呢,主從模式或者業(yè)務(wù)比較復(fù)雜需要連接不同的分庫來支持業(yè)務(wù)。本文主要介紹了SpringBoot搭建多數(shù)據(jù)源的實現(xiàn)方法,感興趣的可以了解一下,感興趣的可以額了解一下2021-12-12

