概念
??????? 狀態(tài)模式
(State Pattern)是一種行為型設(shè)計(jì)模式,用于解決對(duì)象在不同狀態(tài)下的行為問(wèn)題。它允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。狀態(tài)模式主要包含三個(gè)部分:上下文
(Context)、狀態(tài)接口
(State)和具體狀態(tài)實(shí)現(xiàn)類
(ConcreteState)。
組成角色
- 狀態(tài)接口(State):定義一個(gè)接口,用于封裝與上下文類的一個(gè)特定狀態(tài)相關(guān)的行為。
- 具體狀態(tài)實(shí)現(xiàn)類(ConcreteState):實(shí)現(xiàn)狀態(tài)接口,定義與該狀態(tài)相關(guān)的行為。
- 上下文(Context):維護(hù)一個(gè) State 類型的對(duì)象實(shí)例,該實(shí)例定義當(dāng)前的狀態(tài)。
相關(guān)圖示
圖片來(lái)自:https://refactoringguru.cn/design-patterns/state
代碼示例
//狀態(tài)接口
interface State {
void handle(Context context);
}
//具體狀態(tài)實(shí)現(xiàn)類ConcreteStateA、ConcreteStateB
class ConcreteStateA implements State {
@Override
public void handle(Context context) {
System.out.println("當(dāng)前狀態(tài)是 A.");
//設(shè)置下一個(gè)執(zhí)行狀態(tài)節(jié)點(diǎn)
context.setState(new ConcreteStateB());
}
}
class ConcreteStateB implements State {
@Override
public void handle(Context context) {
System.out.println("當(dāng)前狀態(tài)是 B.");
//設(shè)置下一個(gè)執(zhí)行狀態(tài)節(jié)點(diǎn)
context.setState(new ConcreteStateA());
}
}
//上下文對(duì)象
class Context {
//當(dāng)前執(zhí)行節(jié)點(diǎn)
private State state;
public Context(State state) {
this.state = state;
}
public void setState(State state) {
this.state = state;
}
public State getState() {
return state;
}
//執(zhí)行節(jié)點(diǎn)邏輯
public void request() {
state.handle(this);
}
}
public class StatePatternDemo {
public static void main(String[] args) {
State initialState = new ConcreteStateA();
Context context = new Context(initialState);
//狀態(tài)節(jié)點(diǎn)流轉(zhuǎn) A -> B -> A
context.request(); // 輸出:當(dāng)前狀態(tài)是 A.
context.request(); // 輸出:當(dāng)前狀態(tài)是 B.
context.request(); // 輸出:當(dāng)前狀態(tài)是 A.
}
}
框架中的應(yīng)用
??????? 一個(gè)常見(jiàn)的使用狀態(tài)設(shè)計(jì)模式的例子是Java線程的狀態(tài)管理。Java的Thread類使用了狀態(tài)模式來(lái)表示線程的不同狀態(tài),例如:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。這些狀態(tài)之間的轉(zhuǎn)換由Thread類和相關(guān)的方法控制。
Thread.State枚舉,它定義了Java線程的各種狀態(tài):
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
線程狀態(tài)之間的轉(zhuǎn)換:
- NEW:當(dāng)線程剛創(chuàng)建時(shí),它處于NEW狀態(tài)。在這個(gè)狀態(tài)下,線程還沒(méi)有開(kāi)始執(zhí)行。
- RUNNABLE:當(dāng)調(diào)用線程的start()方法后,線程進(jìn)入RUNNABLE狀態(tài)。此時(shí),線程已經(jīng)開(kāi)始執(zhí)行或者準(zhǔn)備執(zhí)行,等待操作系統(tǒng)分配資源。
- BLOCKED:當(dāng)線程試圖獲取一個(gè)已被其他線程鎖定的對(duì)象的監(jiān)視器(即進(jìn)入synchronized塊)時(shí),線程進(jìn)入BLOCKED狀態(tài)。一旦鎖被釋放,線程將重新進(jìn)入RUNNABLE狀態(tài)。
- WAITING:當(dāng)線程調(diào)用wait()、join()或LockSupport.park()方法時(shí),線程進(jìn)入WAITING狀態(tài)。這表示線程正在等待另一個(gè)線程的通知或中斷。當(dāng)線程收到通知或中斷時(shí),它將重新進(jìn)入RUNNABLE狀態(tài)。
- TIMED_WAITING:當(dāng)線程調(diào)用wait(long timeout)、sleep(long millis)、join(long millis)或LockSupport.parkNanos()等方法時(shí),線程進(jìn)入TIMED_WAITING狀態(tài)。這表示線程正在等待另一個(gè)線程的通知、中斷或超時(shí)。當(dāng)線程收到通知、中斷或超時(shí)時(shí),它將重新進(jìn)入RUNNABLE狀態(tài)。
- TERMINATED:當(dāng)線程執(zhí)行完成或被中斷時(shí),它進(jìn)入TERMINATED狀態(tài)。在這個(gè)狀態(tài)下,線程已經(jīng)結(jié)束,不能再次啟動(dòng)。
狀態(tài)切換圖
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-413279.html
適用場(chǎng)景
- 對(duì)象的行為隨其狀態(tài)改變而改變:當(dāng)一個(gè)對(duì)象的行為因其內(nèi)部狀態(tài)而改變時(shí),可以考慮使用狀態(tài)模式。狀態(tài)模式將對(duì)象的狀態(tài)和行為分離,使得狀態(tài)和行為可以獨(dú)立地變化,提高了代碼的靈活性和可維護(hù)性。
- 避免大量條件語(yǔ)句:狀態(tài)模式可以減少因狀態(tài)判斷而導(dǎo)致的大量條件語(yǔ)句。通過(guò)使用狀態(tài)模式,可以將狀態(tài)相關(guān)的行為分散到各個(gè)狀態(tài)類中,降低了代碼的復(fù)雜性。
- 狀態(tài)轉(zhuǎn)換清晰:當(dāng)一個(gè)對(duì)象的狀態(tài)轉(zhuǎn)換邏輯復(fù)雜且需要明確表示時(shí),狀態(tài)模式可以使?fàn)顟B(tài)轉(zhuǎn)換更加清晰。狀態(tài)模式將狀態(tài)轉(zhuǎn)換邏輯封裝在狀態(tài)類中,有助于理解和維護(hù)狀態(tài)轉(zhuǎn)換邏輯。
以下是一些使用狀態(tài)設(shè)計(jì)模式的實(shí)際場(chǎng)景:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-413279.html
- 線程狀態(tài)管理:Java線程狀態(tài)管理是狀態(tài)設(shè)計(jì)模式的一個(gè)典型應(yīng)用。線程的狀態(tài)(如新建、運(yùn)行、阻塞等)由Thread.State枚舉表示,狀態(tài)之間的轉(zhuǎn)換由Thread類及其相關(guān)方法控制。
- 工作流引擎:工作流引擎通常需要處理多個(gè)狀態(tài)和狀態(tài)之間的轉(zhuǎn)換。狀態(tài)模式可以幫助設(shè)計(jì)一個(gè)靈活的工作流引擎,使得狀態(tài)和行為可以獨(dú)立地變化。
- 游戲角色狀態(tài):在游戲開(kāi)發(fā)中,角色可能有多種狀態(tài)(如站立、行走、攻擊等),并且狀態(tài)之間可以相互轉(zhuǎn)換。使用狀態(tài)模式可以使游戲角色的狀態(tài)管理更加清晰。
- 訂單狀態(tài)管理:在電商系統(tǒng)中,訂單可能有多個(gè)狀態(tài)(如待付款、待發(fā)貨、已發(fā)貨等),并且狀態(tài)之間有一定的轉(zhuǎn)換邏輯。狀態(tài)模式可以幫助設(shè)計(jì)一個(gè)易于維護(hù)的訂單狀態(tài)管理系統(tǒng)。
到了這里,關(guān)于狀態(tài)設(shè)計(jì)模式(State Pattern)[論點(diǎn):概念、相關(guān)角色、圖示、示例代碼、框架中的運(yùn)用、適用場(chǎng)景]的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!