bacor

个人站

Coding is important, so is writing


状态模式

状态模式和状态机关系密切,我们可以用状态机来辅助理解这个设计模式。

定义

当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。

通用类图如下:

类图中有3种角色:
State抽象状态角色负责定义对象状态和封装环境角色以实现状态切换
ConcreteState具体状态角色负责完成本状态行为管理和状态切换
Context环境角色定义客户端接口和执行具体状态切换
对于环境角色,一般有

  • 把状态对象声明为静态常量
  • 环境角色用委托方式具有状态抽象角色定义的所有行为

优点

  • 结构清晰,避免过多的if…else或switch…case语句的使用
  • 遵循开闭原则和单一职责原则
  • 良好的封装性

缺点

  • 状态过多容易导致类膨胀

使用场景

  • 行为随状态改变而改变
  • 替代条件、分支判断语句

扩展

  1. 统计功能
  2. 多个访问者
  3. 双分派

参考:

设计模式之禅