java状态机核心是用接口抽象状态与转移,状态接口定义统一行为契约,具体状态类实现接口并封装自身行为与转移规则,上下文持有当前状态并委托调用,支持枚举等轻量实现。

Java 中用接口实现状态机,核心是把“状态”和“状态转移”抽象成接口,让具体状态类只关注自身行为,不耦合上下文逻辑。
定义状态接口:统一行为契约
状态接口声明所有状态共有的操作,比如处理事件、进入/退出动作。它不关心具体怎么实现,只约定“能做什么”。
- 方法应聚焦在状态响应上,例如
handleEventA(Context ctx)、onEnter(Context ctx) - 避免在接口中暴露状态内部数据或上下文细节,保持低耦合
- 可配合枚举或常量定义有限状态集,辅助类型安全(如
State.IDLE)
为每个状态提供实现类
每个具体状态(如 IdleState、RunningState)实现状态接口,并封装该状态下合法的行为和转移规则。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在
handleEventX()中决定是否改变状态,例如:ctx.transitionTo(new RunningState()) - 状态类本身无状态变量(不保存 context 引用),只依赖传入的上下文参数做决策
- 可复用状态对象(单例模式),避免频繁创建,因状态类通常是无状态的
上下文类:持有当前状态并委托调用
上下文(如 StateMachineContext)持有一个 State 类型的引用,对外提供统一入口(如 trigger(Event e)),内部将调用转发给当前状态。
- 状态变更通过
setState(State newState)完成,确保转移可控 - 可在
setState()中加入日志、校验或回调(如oldState.onExit(this)→newState.onEnter(this)) - 上下文负责管理生命周期与共享数据(如计数器、配置),不参与状态逻辑判断
可选增强:用枚举实现状态(轻量级方案)
若状态少、逻辑简单,直接用枚举实现状态接口更简洁:
<font size="2"><pre class="brush:php;toolbar:false;">enum OrderState implements State {<br> DRAFT {<br> public void handleConfirm(Context c) { c.transitionTo(SUBMITTED); }<br> },<br> SUBMITTED {<br> public void handlePay(Context c) { c.transitionTo(PAID); }<br> },<br> PAID;<br>}
枚举天然单例、线程安全,适合固定状态集;但复杂行为(如含大量字段或依赖注入)仍建议用独立类。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










