状态模式在javascript中依托原型链实现行为复用与动态切换:状态类继承basestate共享通用逻辑,context通过委托调用当前状态方法,避免继承滥用,确保状态并列独立。

状态模式本身不依赖继承,但 JavaScript 中的继承机制(尤其是原型链)能自然支撑状态类之间的行为复用与动态切换。关键在于:把“不同状态下的行为”封装成独立对象,再让这些对象共享通用逻辑——这恰好契合原型继承的设计哲学。
状态类用原型链实现行为复用
多个具体状态(如 IdleState、RunningState、PausedState)可继承自一个 BaseState 类,把共用方法(如 logTransition、isValidNext)放在基类原型上。子状态无需重复实现,直接调用即可。
- 避免在每个状态类里写相同的日志、校验或兜底逻辑
- 修改基类原型方法,所有已创建的状态实例立即生效
- 例如:
BaseState.prototype.enter = function() { console.log(`${this.name} entered`); },所有继承它的状态自动获得enter行为
上下文对象通过委托而非继承管理状态切换
环境类(Context)不继承任何状态类,而是持有当前状态对象的引用,并把行为委托给它。当调用 context.handleInput() 时,实际执行的是 currentState.handleInput() —— 这正是原型链“运行时委托”的典型体现。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- Context 本身不包含具体业务逻辑,只负责状态流转控制
- 状态变更只需替换
this.currentState引用,无需修改 Context 结构 - 结合
Object.create(StatePrototype)创建轻量状态实例,避免构造函数开销
利用 class 继承 + super 实现状态间协作
某些场景下,状态转换需要前序状态参与(比如暂停时保存运行时数据)。这时可在子状态中调用 super.exit(),由基类统一处理清理逻辑。
- 例如
RunningState.exit()先调super.exit()记录时间戳,再执行自身暂停动作 - 保证跨状态的生命周期钩子(
enter/exit)有一致调用顺序 - ES6
class的super语法让这种协作更清晰,且不破坏状态类的独立性
避免继承滥用:状态类之间不形成层级,只共享接口
状态不是“父子关系”,而是“并列选项”。不要让 WalkingState 继承 RunningState,哪怕它们有相似方法——那说明抽象粒度错了。应提取共用行为到工具函数或混入(mixin)对象,再通过原型链挂载。
- 错误做法:
class WalkingState extends RunningState→ 导致状态语义混乱 - 正确做法:定义
MovementHelpers对象,用Object.assign(WalkingState.prototype, MovementHelpers) - 保持每个具体状态类职责单一,切换时不会意外携带无关行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










