实现一个简化版的状态机框架
我将为你设计一个简化版的状态机框架,包含状态、事件、转换机制,并支持插件扩展功能。这个实现会参考Spring StateMachine的设计理念。
核心组件设计
// 状态枚举接口 public interface State { String getId(); } // 事件枚举接口 public interface Event { String getId(); } // 状态上下文 public class StateContext<S extends State, E extends Event> { private S currentState; private E event; private Map<String, Object> extendedState = new HashMap<>(); // 获取当前状态 public S getCurrentState() { return currentState; } // 设置当前状态 public void setCurrentState(S currentState) { this.currentState = currentState; } // 获取触发事件 public E getEvent() { return event; } // 设置触发事件 public void setEvent(E event) { this.event = event; } // 获取扩展状态数据 public Map<String, Object> getExtendedState() { return extendedState; } // 添加扩展状态数据 public void addExtendedState(String key, Object value) { extendedState.put(key, value); } // 获取特定扩展状态数据 public Object getExtendedState(String key) { return extendedState.get(key); } } // 状态转换接口 public interface Transition<S extends State, E extends Event, C extends StateContext<S, E>> { boolean isTriggered(C context); S getSource(); S getTarget(); void executeActions(C context); } // 状态机接口 public interface StateMachine<S extends State, E extends Event, C extends StateContext<S, E>> { S getCurrentState(); void sendEvent(E event, Map<String, Object> extendedState); void addListener(StateMachineListener<S, E, C> listener); void addTransition(Transition<S, E, C> transition); } // 状态机监听器 public interface StateMachineListener<S extends State, E extends Event, C extends StateContext<S, E>> { void stateChanged(S from, S to); void eventAccepted(E event); void transitionStarted(Transition<S, E, C> transition); void transitionCompleted(Transition<S, E, C> transition); }
基础实现
// 枚举状态实现 public enum SimpleState implements State { INITIAL("INIT"), PROCESSING("PROCESS"), COMPLETED("COMPLETE"), ERROR("ERR"); private String id; SimpleState(String id) { this.id = id; } @Override public String getId() { return id; } } // 枚举事件实现 public enum SimpleEvent implements Event { START_PROCESS("START"), FINISH_PROCESS("FINISH"), ERROR_OCCURRED("ERROR"); private String id; SimpleEvent(String id) { this.id = id; } @Override public String getId() { return id; } } // 基础状态机实现 public class BasicStateMachine<S extends State, E extends Event, C extends StateContext<S, E>> implements StateMachine<S, E, C> { private S currentState; private List<Transition<S, E, C>> transitions = new ArrayList<>(); private List<StateMachineListener<S, E, C>> listeners = new ArrayList<>(); private StateMachineLogger logger = new StateMachineLogger(); public BasicStateMachine(S initialState) { this.currentState = initialState; } @Override public S getCurrentState() { return currentState; } @Override public void sendEvent(E event, Map<String, Object> extendedState) { logger.log("Processing event: " + event.getId()); // 创建状态上下文 StateContext<S, E> context = createContext(event, extendedState); // 通知监听器事件已接受 notifyEventAccepted(event); // 查找并执行适用的转换 for (Transition<S, E, C> transition : transitions) { if (transition.getSource().getId().equals(currentState.getId()) && transition.isTriggered((C) context)) { logger.log("Executing transition from " + currentState.getId() + " on " + event.getId()); // 通知监听器转换开始 notifyTransitionStarted(transition); // 执行转换动作 transition.executeActions((C) context); // 更新当前状态 currentState = transition.getTarget(); // 通知监听器状态改变 notifyStateChanged(transition.getSource(), transition.getTarget()); // 通知监听器转换完成 notifyTransitionCompleted(transition); break; } } } private StateContext<S, E> createContext(E event, Map<String, Object> extendedState) { StateContext<S, E> context = new StateContext<>(); context.setCurrentState(currentState); context.setEvent(event); if (extendedState != null) { extendedState.forEach((key, value) -> context.addExtendedState(key, value)); } return context; } @Override public void addListener(StateMachineListener<S, E, C> listener) { listeners.add(listener); } @Override public void addTransition(Transition<S, E, C> transition) { transitions.add(transition); } // 通知状态改变 private void notifyStateChanged(S from, S to) { listeners.forEach(listener -> listener.stateChanged(from, to)); } // 通知事件接受 private void notifyEventAccepted(E event) { listeners.forEach(listener -> listener.eventAccepted(event)); } // 通知转换开始 private void notifyTransitionStarted(Transition<S, E, C> transition) { listeners.forEach(listener -> listener.transitionStarted(transition)); } // 通知转换完成 private void notifyTransitionCompleted(Transition<S, E, C> transition) { listeners.forEach(listener -> listener.transitionCompleted(transition)); } // 日志工具类 private static class StateMachineLogger { public void log(String message) { System.out.println("[StateMachine] " + message); } } }
转换实现
// 条件转换抽象类 public abstract class AbstractTransition<S extends State, E extends Event, C extends StateContext<S, E>> implements Transition<S, E, C> { private S source; private S target; public AbstractTransition(S source, S target) { this.source = source; this.target = target; } @Override public S getSource() { return source; } @Override public S getTarget() { return target; } @Override public void executeActions(C context) { // 子类可以覆盖此方法以执行转换时的操作 } } // 基于事件的转换 public class EventBasedTransition<S extends State, E extends Event, C extends StateContext<S, E>> extends AbstractTransition<S, E, C> { private E event; private Consumer<C> action; public EventBasedTransition(S source, S target, E event) { this(source, target, event, null); } public EventBasedTransition(S source, S target, E event, Consumer<C> action) { super(source, target); this.event = event; this.action = action; } @Override public boolean isTriggered(C context) { return context.getEvent().getId().equals(event.getId()); } @Override public void executeActions(C context) { super.executeActions(context); if (action != null) { action.accept(context); } } } // 条件+事件混合转换 public class ConditionalTransition<S extends State, E extends Event, C extends StateContext<S, E>> extends AbstractTransition<S, E, C> { private E event; private Predicate<C> condition; private Consumer<C> action; public ConditionalTransition(S source, S target, E event, Predicate<C> condition) { this(source, target, event, condition, null); } public ConditionalTransition(S source, S target, E event, Predicate<C> condition, Consumer<C> action) { super(source, target); this.event = event; this.condition = condition; this.action = action; } @Override public boolean isTriggered(C context) { return context.getEvent().getId().equals(event.getId()) && condition.test(context); } @Override public void executeActions(C context) { super.executeActions(context); if (action != null) { action.accept(context); } } }
插件系统设计
// 插件接口 public interface StateMachinePlugin<S extends State, E extends Event, C extends StateContext<S, E>> { void configure(BasicStateMachine<S, E, C> machine); } // 插件支持的状态机 public class PluginEnabledStateMachine<S extends State, E extends Event, C extends StateContext<S, E>> extends BasicStateMachine<S, E, C> { private List<StateMachinePlugin<S, E, C>> plugins = new ArrayList<>(); public PluginEnabledStateMachine(S initialState) { super(initialState); } public void addPlugin(StateMachinePlugin<S, E, C> plugin) { plugins.add(plugin); plugin.configure(this); } } // 示例插件:自动日志记录插件 public class LoggingPlugin<S extends State, E extends Event, C extends StateContext<S, E>> implements StateMachinePlugin<S, E, C> { private final StateMachineLogger logger = new StateMachineLogger(); @Override public void configure(BasicStateMachine<S, E, C> machine) { machine.addListener(new StateMachineListener<S, E, C>() { @Override public void stateChanged(S from, S to) { logger.log("State changed from " + from.getId() + " to " + to.getId()); } @Override public void eventAccepted(E event) { logger.log("Event accepted: " + event.getId()); } @Override public void transitionStarted(Transition<S, E, C> transition) { logger.log("Transition started: " + transition.getSource().getId() + " -> " + transition.getTarget().getId()); } @Override public void transitionCompleted(Transition<S, E, C> transition) { logger.log("Transition completed: " + transition.getSource().getId() + " -> " + transition.getTarget().getId()); } }); } // 内部日志记录器 private static class StateMachineLogger { public void log(String message) { System.out.println("[StateMachine-LOG] " + message); } } } // 示例插件:持久化插件 public class PersistencePlugin<S extends State, E extends Event, C extends StateContext<S, E>> implements StateMachinePlugin<S, E, C>, StateMachineListener<S, E, C> { private final StateMachinePersister persister; public PersistencePlugin(StateMachinePersister persister) { this.persister = persister; } @Override public void configure(BasicStateMachine<S, E, C> machine) { machine.addListener(this); } @Override public void stateChanged(S from, S to) { persister.saveState(to); } @Override public void eventAccepted(E event) { // 不需要处理 } @Override public void transitionStarted(Transition<S, E, C> transition) { // 不需要处理 } @Override public void transitionCompleted(Transition<S, E, C> transition) { // 不需要处理 } // 持久化接口 public interface StateMachinePersister { void saveState(State state); State loadState(); } // 示例内存持久化实现 public static class InMemoryPersister implements StateMachinePersister { private State currentState; @Override public void saveState(State state) { currentState = state; } @Override public State loadState() { return currentState; } } }
使用示例
public class StateMachineDemo { public static void main(String[] args) { // 创建状态机并添加插件 PluginEnabledStateMachine<SimpleState, SimpleEvent, StateContext<SimpleState, SimpleEvent>> machine = new PluginEnabledStateMachine<>(SimpleState.INIT); machine.addPlugin(new LoggingPlugin<>()); InMemoryPersister persister = new PersistencePlugin.InMemoryPersister(); machine.addPlugin(new PersistencePlugin<>(persister)); // 定义状态转换 machine.addTransition(new EventBasedTransition<>( SimpleState.INIT, SimpleState.PROCESSING, SimpleEvent.START_PROCESS, context -> System.out.println("Starting processing..."))); machine.addTransition(new EventBasedTransition<>( SimpleState.PROCESSING, SimpleState.COMPLETED, SimpleEvent.FINISH_PROCESS, context -> System.out.println("Finishing process..."))); machine.addTransition(new EventBasedTransition<>( SimpleState.PROCESSING, SimpleState.ERROR, SimpleEvent.ERROR_OCCURRED, context -> System.out.println("Error occurred during processing"))); // 测试状态转换 System.out.println("Initial state: " + machine.getCurrentState().getId()); System.out.println("\nSending START_PROCESS event:"); machine.sendEvent(SimpleEvent.START_PROCESS, null); System.out.println("Current state: " + machine.getCurrentState().getId()); System.out.println("\nSending FINISH_PROCESS event:"); machine.sendEvent(SimpleEvent.FINISH_PROCESS, null); System.out.println("Current state: " + machine.getCurrentState().getId()); // 测试持久化 System.out.println("\nTesting persistence..."); ((PersistencePlugin.InMemoryPersister) persister).saveState(SimpleState.INIT); SimpleState restoredState = (SimpleState) persister.loadState(); System.out.println("Restored state: " + restoredState.getId()); } }
进一步扩展建议
-
分层状态机:实现父子状态机结构,支持复合状态和子状态机
-
历史状态:添加对历史状态的支持,允许状态机返回到之前的某个状态
-
伪状态:实现初始状态、终止状态等特殊状态类型
-
转换类型:增加外部转换、内部转换、本地转换等不同类型的转换
-
配置DSL:创建流畅的API用于配置状态机,类似:
machine.configure() .from(INIT).on(START_PROCESS).to(PROCESSING) .perform(action)
-
持久化策略:添加更多持久化选项(数据库、文件等)
-
监控插件:添加性能监控、统计信息收集等插件
-
分布式支持:添加集群环境下状态同步的支持
-
异常处理:完善异常处理机制,支持在转换中处理异常
-
表达式支持:集成SpEL或其他表达式语言支持条件判断
这个实现提供了一个灵活的状态机框架基础,可以根据具体需求进一步扩展和完善。