一、状态模式
状态模式( State Pattern ) 也称为状态机模式(State Machine Pattern), 是允许对象在内
部状态发生改变时改变它的行为,对象看起来好像修改了它的类,属于行为型模式。
原文:Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
解释:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
状态模式中类的行为是由状态决定的,不同的状态下有不同的行为。其意图是让一个对象在
其内部改变的时候,其行为也随之改变。状态模式核心是状态与行为绑定,不同的状态对应不
同的行为。
二、状态模式应用场景
状态模式在生活场景中也还比较常见。例如:我们平时网购的订单状态变化。另外,我们平
时坐电梯,电梯的状态变化。
在软件开发过程中,对于某一项操作,可能存在不同的情况。通常处理多情况问题最直接的
方式就是使用if…else或 switch…case条件语句进行枚举。但是这种做法对于复杂状态的判断 天然存在弊端:条件判断语句过于臃肿,可读性差,且不具备扩展性,维护难度也大。而如果
转换思维,将这些不同状态独立起来用各个不同的类进行表示,系统处于哪种情况,直接使用
相应的状态类对象进行处理,消除了 if-else , switch…case等冗余语句,代码更有层次性且具
备良好扩展力。
状态模式主要解决的就是当控制一个对象状态的条件表达式过于复杂时的情况。通过把状态
的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。对象的行为依赖
于它的状态(属性),并且会根据它的状态改变而改变它的相关行为。状态模式适用于以下场景 :
1、 行为随状态改变而改变的场景;
2、 一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。
首先来看下状态模式的通用UML类图:
从 UML类图中,我们可以看到,状态模式主要包含三种角色:
1、环境类角色(Context):定义客户端需要的接口,内部维护一个当前状态实例,并负责
具体状态的切换
2、抽象状态角色(State ):定义该状态下的行为,可以有一个或多个行为;
3、具体状态角色(ConcreteState ):具体实现该状态对应的行为,并且在需要的情况下进行状态切换。
步骤 1 创建一个接口
public interface State { public void doAction(Context context); }
步骤 2创建实现接口的实体类
public class StartState implements State { public void doAction(Context context) { System.out.println("Player is in start state"); context.setState(this); } public String toString(){ return "Start State"; } }
public class StopState implements State { public void doAction(Context context) { System.out.println("Player is in stop state"); context.setState(this); } public String toString(){ return "Stop State"; } }
步骤 3 创建 Context 类。
public class Context { private State state; public Context(){ state = null; } public void setState(State state){ this.state = state; } public State getState(){ return state; } }
步骤 4 使用 Context 来查看当状态 State 改变时的行为变化。
public class StatePatternDemo { public static void main(String[] args) { Context context = new Context(); StartState startState = new StartState(); startState.doAction(context); System.out.println(context.getState().toString()); StopState stopState = new StopState(); stopState.doAction(context); System.out.println(context.getState().toString()); } }
步骤 5 执行程序,输出结果:
Player is in start state Start State Player is in stop state Stop State