目录
定义
状态模式允许一个对象在其内部状态改变时改变它的行为,从外部看来,对象仿佛修改了它的类。它是行为型设计模式的杰出代表,通过将对象的状态封装在不同的状态类中,使得对象的行为能够根据当前状态动态调整。例如,在一个游戏角色系统中,角色可能处于正常、奔跑、跳跃、受伤等多种状态。当角色从正常状态切换到奔跑状态时,其移动速度、动画表现等行为都会随之改变,这正是状态模式的生动体现。
状态模式与策略模式堪称 “亲兄弟”,但二者存在关键区别:策略模式着重于让对象在运行时选择不同的策略来执行特定功能;而状态模式则强调对象在不同状态下自动改变行为,状态的切换驱动着行为的变化。
类图
角色
state:抽象状态对象
抽象状态对象是状态模式的基石,它负责定义对象的状态,并封装了环境角色以实现状态转换。通常以抽象类或接口的形式存在,为具体状态角色提供统一的行为接口。在这个抽象层面,虽然不涉及具体的行为实现,但规定了所有具体状态类必须实现的方法,这些方法涵盖了在该状态下对象可能执行的各种操作。例如,在一个文档审批系统中,抽象状态类可能定义了 “提交审批”“批准”“拒绝” 等方法,不同的具体状态(如 “待审批状态”“审批通过状态”“审批拒绝状态”)将根据自身逻辑实现这些方法。
ConcreteState:具体状态角色
具体状态角色是抽象状态的具体实现,承担着两项重要职责。其一,管理本状态下对象的行为,即实现抽象状态类中定义的方法,以符合该状态下对象应有的行为表现。比如在一个电商订单系统中,“已支付状态” 的具体状态类会实现 “发货” 方法,而 “未支付状态” 的具体状态类则可能将 “发货” 方法实现为空操作或者抛出提示用户先支付的异常。其二,负责趋向状态管理,也就是定义本状态如何过渡到其他状态。例如,在 “已支付状态” 下,当用户取消订单时,可能会切换到 “订单取消状态”。每个具体状态类都专注于自身状态相关的逻辑,使得代码的职责更加清晰,易于维护和扩展。
Context: 环境角色
环境角色是状态模式中的核心协调者,它定义了客户端所需要的接口,客户端通过与环境角色交互来间接操作对象的状态和行为。环境角色内部维护着一个当前状态的引用,这个引用指向具体的状态对象。当客户端调用环境角色的方法时,环境角色会将请求委托给当前的状态对象进行处理。同时,环境角色还负责具体状态的切换,当满足特定条件时,它会改变当前状态的引用,使对象切换到新的状态,从而自动改变对象的行为。以一个自动售货机为例,售货机本身就是环境角色,它维护着机器的当前状态(如 “