一、概念
封装状态的转变过程
1.1、定义
允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
- Context,环境类:一般保存当前的状态【也可以充当状态管理器(State Manager)的角色,管理状态的迁移过程。也可以抽象出一个管理类,专门负责状态的迁移】。
- State,状态抽象类:定义状态的变化时候的执行接口。
- ConcreteState:,具体状态类:
1.2、解决的问题
问题分析:在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。
模式的解决思路:将状态迁移过程、状态的种类和执行过程剥离开来,各自独立隔离。
即单独抽象出状态State基类,定义状态变化的执行接口;一种状态对应一个State子类,各个状态彼此独立。使用Context专门负责状态的迁移过程。
1.3、模式的种类
- 简单状态模式:简单状态模式是指状态都相互独立,状态之间无须进行转换
- 可切换状态的状态模式:在实现状态切换时,在具体状态类内部需要调用环境类Context的setState()方法进行状态的转换操作,在具体状态类中可以调用到环境类的方法,因此状态类与环境类之间通常还存在关联关系或者依赖关系
二、模式的应用和优缺点
2.1、应用场景
- 实例:
OA系统中的单据状态,例如请假单状态
2.2、优缺点
优点
封装了转换规则
枚举可能的状态,在枚举状态之前需要确定状态种类
允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块缺点
状态模式对"开闭原则"的支持并不太好
增加系统的复杂度,不易理解