状态模式

目的

让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。

解释

状态模式源自**有限状态机**,其主要思想是程序在任意时刻仅可处于几种有限状态中。 在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个状态切换到另一个状态。

示例

假设我们要描述一名员工一天不同时间的工作状态,正常来看是比较简单的,直接从早上上班开始,根据一些时间变化切换到其他状态。但假设我们切换到一个状态后又可能需要根据另外的条件再次切换,比如本来在写代码,到晚上了还没写完,继续写。好不容易写完了,需要切换到下班状态;或者没写完,直到睡着还没写完。这需要各种条件判断(每个状态都要判断是否满足跳到其他状态),不光是写起来复杂,新增状态和更新状态更是会变得异常麻烦。

此时,很自然我们就会想要将一个个状态独立出来,为每个状态设置所有需要的切换条件,在状态发生变化时改变对应的行为。这样我们只需要关心状态从 A 转换到 B,而不用管各种判断逻辑。

定义一系列状态以及在状态内部实现该状态的转移逻辑。

  • 抽象状态 State,定义一个抽象方法,如 writeProgram
  • 实现不同的具体状态类:ForenoonStateNoonStateAfternoonState等,并重写抽象方法。
  • 实现一个上下文类:Work 用来管理当前状态。

UML 图

img