状态模式定义
状态模式,是一种对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
1) Normally, state object doesn’t contain any fields 状态对象通常不包含任何
属性
2)Change state: change state object 状态改变时,修改状态对象
3)Methods delegate to state object 具体执行的方法,委托给状态对象
适用条件
1)行为随着状态的改变而改变的时候,这也是状态模式的根本出发点,例如权限设计,人员的状态不同即使执行相同的行为结果也会不同,在这种情况下需要考虑使用状态模式。
2)条件、分支判断语句的替代者,在程序中大量使用 switch 语句或者if-else判断语句会导致程序结构不清晰,逻辑混乱,使用状态模式可以很好地避免这一问题。
状态模式结构
其中这些表示:
1)环境角色(Context):也称上下文,定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
2)抽象状态角色(State):定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。
3)具体状态角色(ConcreteState):每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。
ADT的操作看作是状态转换,都委派给了外部
的state对象,不同的“状态”子类:delegate ADT在该状态Si下能够发生的所有行为,即从Si到其他状态的转换
状态模式在lab3中的应用
设置了每个状态对应的类
状态模式特点
将if-else条件判断转换为了四个相关的状态类来处理,客户端在使用的时候,无需关心当前是哪个状态,它只要执行具体的行为就可以,至于这些行为是否可以在当前状态下得到正确的响应完全由当前的状态类内部去处理。每一个状态类都拥有Context的所有的行为接口方法。在某一个状态类的内部实现中,我们看到,如果一个行为可以执行,那么就实现该行为的代码,如果一个行为在这个状态下是非法的或者禁止的,那么就抛出异常或者你什么也不做。
状态模式优缺点
优点
1)更好地分离状态和行为:状态模式通过设置所有状态类的公共接口,把状态和状态对应的行为分离开,把所有与一个特定的状态相关的行为都放入一个对象中,使得应用程序在控制的时候,只需要关心状态的切换,而不用关心这个状态对应的真正处理。
2)更好的扩展性:入了状态处理的公共接口后,使得扩展新的状态变得非常容易,只需要新增加一个实现状态处理的公共接口的实现类,然后在进行状态维护的地方,设置状态变化到这个新的状态即可。
缺点
一个状态对应一个状态处理类,会使得程序引入太多的状态类,这样程序变得杂乱。状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。