狀態機,包括了狀態和動作,某個**狀態**下,只能執行某些**動作**,如果**動作**不匹配,狀態是不會進行變更了,這樣就保護了我們狀態欄位的準備性,不能隨意改變,必須按著我們**設計的規則**進行狀態的輪轉。 # Stateless實現的狀態機 1. **Stateless**:Stateles ...
狀態機,包括了狀態和動作,某個狀態下,只能執行某些動作,如果動作不匹配,狀態是不會進行變更了,這樣就保護了我們狀態欄位的準備性,不能隨意改變,必須按著我們設計的規則進行狀態的輪轉。
Stateless實現的狀態機
- Stateless:Stateless 是一個簡單且易於使用的狀態機庫,它提供了基本的狀態轉換和動作執行功能。以下是一個使用 Stateless 實現的簡單狀態機示例:
import com.github.oxo42.stateless4j.StateMachine;
import com.github.oxo42.stateless4j.StateMachineConfig;
import com.github.oxo42.stateless4j.transitions.Transition;
public class StateMachineExample {
enum State {
/**
* 表示電話機已經從底座拿起,但用戶還沒有撥打或者接聽電話,此時電話處於空閑狀態
*/
OFF_HOOK,
/**
* 響鈴
*/
RINGING,
/**
* 連接
*/
CONNECTED,
/**
* 表示通話的一方需要暫時掛起通話
*/
ON_HOLD
}
enum Trigger {
/**
* 用戶撥打電話並等待接聽
*/
CALL_DIALED,
/**
* 表示通話結束後掛斷電話
*/
HUNG_UP,
/**
* 表示接聽方接通電話,此時雙方正常通話。
*/
CALL_CONNECTED,
/**
* 表示通話的一方需要暫時掛起通話
*/
PLACED_ON_HOLD,
/**
* 表示恢復保持狀態執行通話【與PLACED_ON_HOLD對應】
*/
TAKEN_OFF_HOLD,
/**
* 留言
*/
LEFT_MESSAGE,
/**
* 表示通話的一方結束通話並停止使用電話
*/
STOP_USING_PHONE
}
public static void main(String[] args) {
// 創建狀態機配置
StateMachineConfig<State, Trigger> config = new StateMachineConfig<>();
// 定義狀態轉換規則
config.configure(State.OFF_HOOK)
.permit(Trigger.CALL_DIALED, State.RINGING);
config.configure(State.RINGING)
.permit(Trigger.HUNG_UP, State.OFF_HOOK)
.permit(Trigger.CALL_CONNECTED, State.CONNECTED);
config.configure(State.CONNECTED)
.permit(Trigger.LEFT_MESSAGE, State.OFF_HOOK)
.permit(Trigger.HUNG_UP, State.OFF_HOOK)
.permit(Trigger.PLACED_ON_HOLD, State.ON_HOLD);
config.configure(State.ON_HOLD)
.permit(Trigger.TAKEN_OFF_HOLD, State.CONNECTED)
.permit(Trigger.HUNG_UP, State.OFF_HOOK);
// 創建狀態機實例
StateMachine<State, Trigger> stateMachine = new StateMachine<>(State.OFF_HOOK, config);
// 執行狀態轉換
stateMachine.fire(Trigger.CALL_DIALED);
stateMachine.fire(Trigger.CALL_CONNECTED);
stateMachine.fire(Trigger.PLACED_ON_HOLD);
stateMachine.fire(Trigger.TAKEN_OFF_HOLD);
stateMachine.fire(Trigger.HUNG_UP);
// 獲取當前狀態
State currentState = stateMachine.getState();
System.out.println("Current State: " + currentState);
}
}
在上面的示例中,我們使用 StateMachine
類創建了一個狀態機,並定義了狀態(State
)和觸發器(Trigger
)。通過配置狀態轉換規則,我們可以使用 fire()
方法觸髮狀態轉換。最後,我們獲取當前狀態並輸出。
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!