示例图
Context
- 定义客户程序需要的接口
- 保持当前状态子类对象
- 可以包含部分业务逻辑
State
- 定义用于封装与上下文的特定状态关联的行为的接口
State subclasses
Context的说明
- Context代表状态相关的请求
- Context可将自己作为一个对象通过参数传递给状态对象,从而可让状态对象访问Context类的方法
- 客户对象先创建一个具体的状态子类的对象s,然后,在创建Context对象时,通过参数将s传递给Context对象。此后,客户程序就不必与该状态对象直接交互
- 状态转换: Context类或具体的状态子类负责
优点
- 很容易添加新的state类
- 它使状态转换显式化
状态模式与策略模式的对比
| State Pattern | Strategy Pattern | | —- | —- | | 状态相关的行为 | 不是状态相关的行为 | | 状态对象可以负责更新配置给Context类的状态对象 | 由客户类创建策略子类对象,并且传递给Context对象。 | | 状态的选择(转换)依赖于Context或者State对象 | 由应用类选择策略子类对象 | | 有状态转换:可以由Context类或者State层次类进行状态转换 | 没有状态转换 | | 可以将一些业务逻辑包含在Context类中(包括状态转换) | 可以将一些业务逻辑包含在Context类中(没有包括状态转换) |
不理解的话可以看一下红绿灯的实例