闭包实现状态机控制器的核心在于用函数内部变量保存当前状态,并通过返回的函数暴露状态迁移和查询能力,避免全局变量污染且保持状态私有性;外层函数初始化状态变量并返回共享访问权的方法,支持合法性校验、参数化迁移、预定义转移规则及可扩展接口如事件监听、序列化和守卫函数。

闭包实现状态机控制器的核心在于:用函数内部变量保存当前状态,再通过返回的函数暴露状态迁移和查询能力,避免全局变量污染,同时保持状态私有性。
用闭包封装状态与迁移逻辑
定义一个外层函数,初始化状态变量(如 currentState),内部返回一组方法(如 next、current、reset),这些方法共享对状态变量的访问权。
- 状态变量不对外暴露,仅通过返回的方法间接操作
- 每个迁移方法可校验合法性(比如只允许从 'idle' → 'running' → 'done')
- 支持传入参数影响迁移结果(例如根据条件跳转不同状态)
支持有限状态集合与动作映射
可在闭包内预定义合法状态列表和转移规则,让控制器具备自检能力。例如用对象映射每个状态允许的下一状态:
const allowedTransitions = {
idle: ['running'],
running: ['done', 'error'],
done: ['idle'],
error: ['idle']
};
在 next() 中检查目标状态是否在当前状态的允许列表中,非法迁移可抛错或静默忽略。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
返回可组合的控制接口
返回的对象不必只提供基础操作,还可添加链式调用、监听回调、序列化等能力:
- on('stateChange', handler):内部维护事件队列,状态变更时触发
- toJSON():返回当前状态快照,便于调试或持久化
- withGuard(guardFn):包装 next,插入前置校验(如权限、网络就绪)
实际使用示例
以下是一个轻量级文件上传状态机:
const createUploadMachine = () => {
let state = 'idle';
const transitions = { idle: ['uploading'], uploading: ['success', 'failed'], success: ['idle'], failed: ['idle'] };
return {
current: () => state,
next: (target) => {
if (transitions[state]?.includes(target)) state = target;
return this;
},
upload: () => this.next('uploading'),
succeed: () => this.next('success'),
fail: () => this.next('failed'),
reset: () => { state = 'idle'; return this; }
};
};
// 使用
const machine = createUploadMachine();
machine.upload().current(); // 'uploading'
machine.succeed().current(); // 'success'
所有状态和逻辑被封闭在函数作用域中,外部无法直接篡改 state,保证了状态一致性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










