示例图
image.png
Context

  • 定义客户程序需要的接口
  • 保持当前状态子类对象
  • 可以包含部分业务逻辑

State

  • 定义用于封装与上下文的特定状态关联的行为的接口

State subclasses

  • 每个子类实现与上下文状态相关联的行为

    何时使用

  • 当对象的行为依赖于状态,而该对象必须根据其状态(在运行时)改变其行为

  • 当操作带有大量状态相关的、多部分的条件语句

Context的说明

  • Context代表状态相关的请求
  • Context可将自己作为一个对象通过参数传递给状态对象,从而可让状态对象访问Context类的方法
  • 客户对象先创建一个具体的状态子类的对象s,然后,在创建Context对象时,通过参数将s传递给Context对象。此后,客户程序就不必与该状态对象直接交互
  • 状态转换: Context类或具体的状态子类负责

image.png

优点

  • 很容易添加新的state类
  • 它使状态转换显式化

    状态模式与策略模式的对比

    | State Pattern | Strategy Pattern | | —- | —- | | 状态相关的行为 | 不是状态相关的行为 | | 状态对象可以负责更新配置给Context类的状态对象 | 由客户类创建策略子类对象,并且传递给Context对象。 | | 状态的选择(转换)依赖于Context或者State对象 | 由应用类选择策略子类对象 | | 有状态转换:可以由Context类或者State层次类进行状态转换 | 没有状态转换 | | 可以将一些业务逻辑包含在Context类中(包括状态转换) | 可以将一些业务逻辑包含在Context类中(没有包括状态转换) |

不理解的话可以看一下红绿灯的实例