状态机模式(State Machine Pattern)是一种用于描述对象行为的软件设计模式,属于行为型设计模式。在状态机模式中,对象的行为取决于其内部状态,并且在不同的状态下,对象可能会有不同的行为。这种模式通常涉及定义一组状态以及状态之间的转换规则,从而实现对对象行为的精确控制。
状态机类图:
状态机模式主要包含以下几个要素:
状态机模式在多种应用场景中都有广泛的应用,包括但不限于以下几个方面:
下面是一个简单的Java状态机模式例子。在这个例子中,我们将模拟一个简单的交通信号灯系统,它有三种状态:红灯(Red)、绿灯(Green)、黄灯(Yellow)。每个状态都有一个特定的行为,即打印出当前灯的颜色,并且每个状态都可以转换到下一个状态。
首先,我们定义一个TrafficLightState
接口,它表示交通信号灯的所有可能状态:
public interface TrafficLightState {
void change(TrafficLightContext context);
}
然后,我们为每种状态实现这个接口:
public class RedLightState implements TrafficLightState {
@Override
public void change(TrafficLightContext context) {
System.out.println("红灯亮");
context.setState(new GreenLightState());
}
}
public class GreenLightState implements TrafficLightState {
@Override
public void change(TrafficLightContext context) {
System.out.println("绿灯亮");
context.setState(new YellowLightState());
}
}
public class YellowLightState implements TrafficLightState {
@Override
public void change(TrafficLightContext context) {
System.out.println("黄灯亮");
context.setState(new RedLightState());
}
}
接下来,我们定义TrafficLightContext
类,它包含了当前的状态,并且提供了一个方法来改变状态:
public class TrafficLightContext {
private TrafficLightState state;
public TrafficLightContext() {
this.state = new RedLightState();
}
public void setState(TrafficLightState state) {
this.state = state;
}
public void change() {
state.change(this);
}
}
最后,我们创建一个客户端来模拟交通信号灯的状态变化:
public class Client {
public static void main(String[] args) {
TrafficLightContext context = new TrafficLightContext();
// 模拟状态变化
context.change();
context.change();
context.change();
context.change();
context.change();
}
}
在这个例子中,TrafficLightContext
类维护了当前的交通信号灯状态,并且提供了一个change
方法来改变状态。每个状态类都实现了TrafficLightState
接口,并且在其change
方法中定义了下一个状态。客户端通过调用TrafficLightContext
的change
方法来模拟交通信号灯的状态变化。
现实中的状态转变,比这个复杂多了,一个状态节点可能有多个action操作,类似订单状态的流转,无法直接套用状态机模式,应该有记录状态变迁的全景图(核心要素:当前状态,当前状态可选动作,动作执行后状态迁移)。
以下是一个简单的例子,记录当前状态,可选动作及执行动作后状态的一个例子,用于约束状态的变迁,。
package demo;
import java.util.HashMap;
import java.util.Map;
public class StateMachine {
/**
* key:当前状态 ,value: Map,可选的动作及后续状态,key:xxxAction,value:nextState
*/
private Map> stateMap;
public StateMachine() {
stateMap = new HashMap>();
// 初始状态可以执行的Action及执行后的动作
Map initActionMap = new HashMap();
initActionMap.put("runAction", "run");
stateMap.put("init", initActionMap);
// run状态下可以执行的动作
Map runActionMap = new HashMap();
runActionMap.put("stopAction", "stop");
runActionMap.put("sleepAction", "sleep");
runActionMap.put("endAction", "end");
stateMap.put("run", runActionMap);
// sleep状态下可以执行的动作
Map sleepActionMap = new HashMap();
sleepActionMap.put("runAction", "run");
stateMap.put("sleep", sleepActionMap);
// stop状态下可以执行的动作
Map stopActionMap = new HashMap();
stopActionMap.put("runAction", "run");
stateMap.put("stop", stopActionMap);
}
public String getNextState(String curState, String action) {
Map curStateMap = stateMap.get(curState);
if (curStateMap == null) {
System.out.println("curState error");
return "";
}
String nextState = curStateMap.get(action);
if (nextState == null) {
System.out.println("acction error");
return "";
}
return nextState;
}
public static void main(String[] args) {
StateMachine sm = new StateMachine();
String nextState = sm.getNextState("init", "runAction");
System.out.println(nextState);
nextState = sm.getNextState("run", "stopAction");
System.out.println(nextState);
nextState = sm.getNextState("stop", "runAction");
System.out.println(nextState);
nextState = sm.getNextState("run", "endAction");
System.out.println(nextState);
}
}
状态机模式是一种强大的工具,能够帮助开发者在软件开发中处理复杂的逻辑和状态管理问题。通过明确定义系统的状态和转换规则,状态机模式使得系统的行为更加清晰、可控和易于维护。同时,状态机模式还具有广泛的应用场景和灵活的实现方式,适用于多种复杂的软件开发需求。
如果状态模式对你有用,记得点赞收藏。