java状态机采用抽象类+子类+上下文三要素:抽象状态类定义统一契约并支持横切逻辑,具体子类专注合法行为且不存数据,上下文托管流转并委托调用,确保开闭原则与解耦。

Java 中抽象类定义状态机基础框架,核心是把“状态”变成可替换的行为容器,用统一契约约束行为、用具体子类实现合法动作、用上下文托管流转,避免 if-else 散布和状态判断耦合。
抽象状态类:声明统一操作契约
定义一个 abstract 类(如 State),声明所有可能被触发的动作方法,但不提供实现:
- 每个方法代表一个外部可调用事件,比如 pay()、ship()、cancel()
- 方法签名建议接收上下文对象(如 void pay(OrderContext context)),便于状态内部驱动流转
- 可提供默认空实现或抛异常的 invalidOperation(),作为非法操作兜底
- 避免使用接口——抽象类后续可注入日志、审计、校验等横切逻辑,接口做不到
具体状态子类:专注本状态下的合法行为
每个实际状态(如 PendingPaymentState、PaidState)继承抽象状态类,只实现自己允许的动作:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 待支付状态中,pay() 执行成功后调用 context.setState(new PaidState())
- 其他非法操作(如在待支付状态下调用 ship())直接抛异常或走 invalidOperation()
- 不保存业务数据——所有状态相关字段都放在 Context 中,保持状态类轻量
- 新增状态只需加新子类,不修改已有代码,符合开闭原则
上下文类:只做委托与状态托管
Context(如 OrderContext)是状态机的中枢,不参与任何条件判断:
- 持有 State 类型的 final 字段,通过 setState() 替换引用
- 提供统一入口方法(如 handlePay()),内部直接委托给当前状态对象
- 初始化时指定起始状态(如 new PendingPaymentState()),之后所有流转由状态子类主动触发
- 可选增强:在 setState() 中校验跳转合法性(如禁止从已发货直接退回到待支付)
状态流转与实战细节
真实落地时,几个关键点决定是否健壮:
- 状态类之间不能互相持有引用,所有跳转必须经由 Context 中转,防止循环依赖
- 数据库只存状态枚举值(如 "PAID"),加载时按值 new 对应状态类并传入 context
- 测试重点是“在 A 状态下调 B 操作 → 是否进入 C 状态 + 是否触发预期副作用”,而非单个方法返回值
- 避免在抽象类构造器中调用抽象方法——子类尚未完成初始化,极易引发 NPE 或未定义行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










