在状态模式中,this作为上下文引用被安全传递,使状态对象能访问上下文数据和方法;通过setState传入this实现状态切换,确保同一上下文实例绑定、数据一致与生命周期安全。

在状态模式中,this 关键字本身并不直接“切换状态”,而是作为当前上下文对象的引用,让状态对象能安全、清晰地访问上下文的数据和行为。真正实现平滑切换的关键,在于让上下文对象持有当前状态的引用,并通过 this 将自身(即上下文实例)传给新状态,从而维持状态转换的连贯性和封装性。
用 this 传递上下文,避免状态对象脱离环境
每个具体状态类(如 PlayingState、PausedState)通常需要操作上下文中的字段(如播放位置、缓冲区)或触发上下文的方法(如 notifyStateChanged())。如果状态对象无法访问上下文,就会丧失行为依据。因此,在状态切换时,应显式把 this(即当前上下文实例)传给新状态:
- 上下文类中定义
setState(State newState)方法 - 在该方法内调用
newState.handleContext(this)或直接在构造新状态时传入 this - 这样新状态就能通过持有的上下文引用,读写其属性、调用其委托方法,而无需暴露上下文内部细节
在状态内部用 this 访问上下文的统一入口
为保持一致性,建议所有状态类都接受一个上下文参数(常命名为 context),并在内部保存。当状态需要触发状态变更(例如暂停时点按播放按钮应切回播放态),它不自己 new 一个新状态,而是调用 context.setState(new PlayingState(context)) —— 这里再次用到 this(即 context)确保新状态与原上下文绑定同一实例:
- 避免不同状态持有多份上下文快照,导致数据不一致
- 使状态转换可追溯、可调试(比如打印
context.hashCode()可验证始终是同一个对象) - 支持上下文在切换前/后执行钩子逻辑(如日志、资源清理),只需在
setState内部处理
避免 this 提前暴露或逃逸引发的生命周期问题
在构造状态对象时若过早将 this 传出去(如在上下文构造函数中就初始化并设置状态),可能导致状态对象引用了一个尚未初始化完成的上下文。稳妥做法是:
- 上下文的字段初始化完毕后再设置初始状态
- 状态对象内部不缓存 this 的非安全引用(如弱引用需谨慎,强引用要明确生命周期)
- 若上下文可能被销毁(如 Android Activity、前端组件),状态中对 this 的使用应配合生命周期检查(如
if (context.isValid()))
结合模板方法,让 this 成为行为协调枢纽
可在上下文中定义模板方法(如 handleUserAction()),内部调用 currentState.handle(this)。此时 this 是统一的调度入口,各状态只需专注自身逻辑,无需关心“谁调用了我”或“下一步该找谁”。这种设计下:
- 新增状态无需修改上下文主流程
- 状态间跳转逻辑集中在各自
handle方法内,可读性强 - this 承担了“我是谁”和“我能做什么”的双重角色,自然支撑起状态自治与上下文协同的平衡

















