状态模式和状态机关系密切,我们可以用状态机来辅助理解这个设计模式。
定义
当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。
通用类图如下:

类图中有3种角色:
State抽象状态角色负责定义对象状态和封装环境角色以实现状态切换;
ConcreteState具体状态角色负责完成本状态行为管理和状态切换;
Context环境角色定义客户端接口和执行具体状态切换。
对于环境角色,一般有
- 把状态对象声明为静态常量
- 环境角色用委托方式具有状态抽象角色定义的所有行为
优点
- 结构清晰,避免过多的if…else或switch…case语句的使用
- 遵循开闭原则和单一职责原则
- 良好的封装性
缺点
- 状态过多容易导致类膨胀
使用场景
- 行为随状态改变而改变
- 替代条件、分支判断语句
扩展
- 统计功能
- 多个访问者
- 双分派
参考:
设计模式之禅