狀態(tài)模式是什么?
狀態(tài)模式,也被稱作狀態(tài)對象模式,是一種行為設(shè)計(jì)模式。
當(dāng)一個(gè)對象的內(nèi)在狀態(tài)改變時(shí),允許改變其行為,這個(gè)對象看起來像是改變了其類。
它讓對象在其內(nèi)部狀態(tài)改變時(shí)改變自己的行為。外部調(diào)用者無需了解對象內(nèi)部狀態(tài)的具體實(shí)現(xiàn),僅需通過簡單的接口進(jìn)行交互。
狀態(tài)模式適用于哪些場景?
當(dāng)你的對象基于其狀態(tài)有不同的行為,并且其狀態(tài)可以在運(yùn)行時(shí)動態(tài)轉(zhuǎn)換時(shí),你應(yīng)該考慮使用狀態(tài)模式。
如何在Java中實(shí)現(xiàn)狀態(tài)模式?——自動販賣機(jī)
讓我們以一個(gè)簡單的售賣飲料的自動販賣機(jī)為例,來展示如何在Java中實(shí)現(xiàn)狀態(tài)模式。我們首先定義一個(gè)狀態(tài)接口:
public interface State {
void insertCoin();
void pushButton();
void dispense();
}
然后,我們?yōu)樽詣迂溬u機(jī)的每一種狀態(tài)實(shí)現(xiàn)該接口:
public class NoCoinState implements State {
public void insertCoin() {
// 接收硬幣,并轉(zhuǎn)換狀態(tài)
}
public void pushButton() {
// 提示用戶先投幣
}
public void dispense() {
// 無行為
}
}
public class HasCoinState implements State {
public void insertCoin() {
// 提示用戶已經(jīng)投過幣了
}
public void pushButton() {
// 檢查庫存,然后轉(zhuǎn)換狀態(tài)
}
public void dispense() {
// 無行為
}
}
public class SoldState implements State {
public void insertCoin() {
// 提示用戶等待飲料出貨
}
public void pushButton() {
// 提示用戶等待飲料出貨
}
public void dispense() {
// 出貨,然后轉(zhuǎn)換狀態(tài)
}
}
最后,我們實(shí)現(xiàn)自動販賣機(jī)類:
public class VendingMachine {
private State noCoinState;
private State hasCoinState;
private State soldState;
private State state; // 當(dāng)前狀態(tài)
public VendingMachine() {
noCoinState = new NoCoinState();
hasCoinState = new HasCoinState();
soldState = new SoldState();
state = noCoinState; // 初始狀態(tài)
}
public void insertCoin() {
state.insertCoin();
}
public void pushButton() {
state.pushButton();
state.dispense();
}
// 其他方法,例如改變狀態(tài)...
}
這樣,我們的自動販賣機(jī)就可以根據(jù)自身的狀態(tài)決定相應(yīng)的行為,而無需在一個(gè)方法中使用大量的條件語句來判斷狀態(tài)。此外,如果未來我們需要添加更多的狀態(tài)或者行為,我們也可以很容易地進(jìn)行拓展。
另一個(gè)例子——音頻播放器
讓我們從一個(gè)現(xiàn)實(shí)生活的例子看一看狀態(tài)模式如何被運(yùn)用到音頻播放器的開發(fā)中。
音頻播放器根據(jù)用戶的操作和播放條件,可能有多種的狀態(tài):例如,“播放狀態(tài)”,“暫停狀態(tài)”,“停止?fàn)顟B(tài)"和"緩沖狀態(tài)”。不同的狀態(tài)下,音頻播放器的響應(yīng)行為可能會不同。
首先,定義一個(gè)狀態(tài)接口:
public interface State {
void play();
void pause();
void stop();
void buffer();
}
然后,實(shí)現(xiàn)播放器的每一個(gè)狀態(tài):
public class PlayingState implements State {
public void play() {
// 無響應(yīng)或提示正在播放
}
public void pause() {
// 暫停播放,并轉(zhuǎn)換到暫停狀態(tài)
}
public void stop() {
// 停止播放,并轉(zhuǎn)換到停止?fàn)顟B(tài)
}
public void buffer() {
// 無行為或轉(zhuǎn)到緩沖狀態(tài)
}
}
// 類似的,我們還可以定義PauseState、StopState和BufferingState類
在定義了各種狀態(tài)以后,我們就可以在音頻播放器類中使用這些狀態(tài):文章來源:http://www.zghlxwxcb.cn/news/detail-808999.html
public class AudioPlayer {
private State playingState;
private State pauseState;
private State stopState;
private State bufferingState;
private State state; // 當(dāng)前狀態(tài)
public AudioPlayer() {
playingState = new PlayingState();
pauseState = new PauseState();
stopState = new StopState();
bufferingState = new BufferingState();
state = stopState; // 初始狀態(tài)
}
public void play() {
state.play();
}
public void pause() {
state.pause();
}
public void stop() {
state.stop();
}
public void buffer() {
state.buffer();
}
// 其他方法,例如改變狀態(tài)...
}
這樣,音頻播放器就可以根據(jù)當(dāng)前的狀態(tài)來進(jìn)行不同的操作,比如在"播放狀態(tài)"下如果用戶按了播放按鈕,播放器可以選擇無響應(yīng)或者給出正在播放的提示,而在"暫停狀態(tài)"下則會恢復(fù)播放。這就是狀態(tài)模式的魅力,使得音頻播放器的代碼更易于管理和維護(hù)。如果我們需要添加新的狀態(tài)或行為,也可以輕松地進(jìn)行拓展。希望通過這篇博文,你能對狀態(tài)模式有更深入的理解和應(yīng)用。文章來源地址http://www.zghlxwxcb.cn/news/detail-808999.html
到了這里,關(guān)于【設(shè)計(jì)模式】騰訊二面:自動販賣機(jī)/音頻播放器使用了什么設(shè)計(jì)模式?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!