在Java程序中实现一个状态机,你可以采用几种不同的设计模式。
1.第一版状态机
下面是一个简单的状态机实现,使用了枚举类型来表示状态,并且使用了状态模式(State Pattern)来实现状态之间的转换。
public enum ProcessState {
STARTED,
IN_PROGRESS,
FINISHED
}
接下来,定义状态机的上下文环境,它将持有当前的状态,并允许你改变状态:
public class ProcessContext {
private ProcessState currentState;
public ProcessContext() {
currentState = ProcessState.STARTED; // 初始状态
}
public void setCurrentState(ProcessState state) {
this.currentState = state;
}
public ProcessState getCurrentState() {
return currentState;
}
public void next() {
switch (currentState) {
case STARTED:
setCurrentState(ProcessState.IN_PROGRESS);
break;
case IN_PROGRESS:
setCurrentState(ProcessState.FINISHED);
break;
case FINISHED:
System.out.println("Process is already finished.");
break;
}
}
}
在这个例子中,ProcessContext 类拥有一个 currentState 属性来跟踪当前的状态,并有一个 next 方法来转移到下一个状态。这是一个非常简单的状态机,它假定状态的转换是线性的(从开始到进行中,再到结束)。
2.第二种状态机
如果你的状态转换更加复杂,或者你需要在状态转换时执行更多的逻辑,你可以为每个状态创建一个单独的类,并实现一个共同的接口。这样,每个状态都可以有自己的转换逻辑。这是状态模式的一个例子:
public interface ProcessState {
void next(ProcessContext context);
}
public class StartedState implements ProcessState {
@Override
public void next(ProcessContext context) {
// 在这里实现从开始到进行中状态的逻辑
context.setCurrentState(new InProgressState());
}
}
public class InProgressState implements ProcessState {
@Override
public void next(ProcessContext context) {
// 在这里实现从进行中到结束状态的逻辑
context.setCurrentState(new FinishedState());
}
}
public class FinishedState implements ProcessState {
@Override
public void next(ProcessContext context) {
// 已经是结束状态,可能不需要做任何事情,或者抛出一个异常
System.out.println("Process is already finished.");
}
}
public class ProcessContext {
private ProcessState currentState;
public ProcessContext() {
currentState = new StartedState(); // 初始状态
}
public void setCurrentState(ProcessState state) {
this.currentState = state;
}
public void next() {
currentState.next(this);
}
}
在这个状态模式的实现中,每个状态都是一个实现了 ProcessState 接口的类。这样,每个状态类都可以有自己的 next 方法,负责处理状态转换的逻辑。ProcessContext 类持有一个 ProcessState 类型的对象,代表当前的状态,并通过调用当前状态的 next 方法来进行状态转换。
在实际应用中,状态模式可以很好地处理更复杂的状态机逻辑,每个状态可以有自己的行为,甚至可以根据不同的条件转移到不同的状态。这种设计也更容易扩展和维护。
标签:状态,next,状态机,ProcessState,public,currentState From: https://www.cnblogs.com/PythonOrg/p/18070150