概述
- 状态模式的关键时将对象的状态封装成为独立的类,对象调用方法时,可以委托当前对象所具有的状态调用相应的方法,使当前对象看起来好像修改了它的类。
状态模式的结构
状态模式包含三种角色。
- 环境(Context)
- 抽象状态(State)
- 具体状态(Concrete State)
环境(Context)
- 环境是一个类。
- 该类含有抽象状态(State)声明的变量,可以引用任何具体状态类的实例。用户对该环境(Context)类的实例在某种状态下的行为感兴趣。
抽象状态(State)
- 抽象状态是一个接口或抽象类。
- 抽象状态中定义了与环境(Context)的一个特定状态相关的若干个方法。
具体状态(Concrete State)
- 具体状态是实现(扩展)抽象状态(抽象类)的类。
状态模式的优点
- 使用一个类封装对象的一种状态,很容易增加新的状态。
- 在状态模式中,环境(Context)中不必出现大量的条件判断语句。环境(Context)实例所呈现的状态变得更加清晰、容易理解。
- 使用状态模式可以让用户程序很方便地切换环境(Context)实例的状态。
- 使用状态模式不会让环境(Context)的实例中出现内部状态不一致的情况。
- 当状态对象没有实例变量时,环境(Context)的各个实例可以共享一个状态对象。
适合状态模式的情景
- 一个对象的行为依赖于它的状态,并且它必须在运行时根据状态改变它的行为。
- 需要编写大量的条件分支语句来决定一个操作的行为,而且这些条件恰好表示对象的一种状态。