定义与特点
状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
状态模式是一种对象行为型模式,其主要优点如下。
状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。
减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。
有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。
状态模式的主要缺点如下。
状态模式的使用必然会增加系统的类与对象的个数。
状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
模式的结构
状态模式包含以下主要角色。
- 环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。
- 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。
- 具体状态(Concrete State)角色:实现抽象状态所对应的行为。
状态模式与有限状态机
第一次看到这两个概念的时候,我首先考虑的是他们之间有什么关联?或者说状态机是使用状态模式实现的?
对比分析
状态模式建议你将所有特定于状态的代码抽取到一组独立的类中,关注的是代码层面的逻辑分离。而有限状态机更多关心的是状态的流转,将状态变化的过程拆分为4个要素:现态、条件、动作、次态,不光是逻辑分离,更多关注的是状态的管理(状态转换的规则等)。
- 状态模式的状态驱动是由Concrete State控制的,而有限状态机的状态驱动是状态机配置的规则。
- 状态模式的行为是写在Concrete State中的,而有限状态机的action代码也是单独存放的,以匿名类或者方法的形式,又或者说单独声明一个具体的类来负责也是可以的(这样是不是就是状态模式了?╮( ̄▽  ̄)╭)。
所以,我个人认为,有限状态机的部分元素是可以用状态模式实现的,但整体来说,状态模式和有限状态机还是两种不同的东西,最起码他们俩关注的角度是不一样的。