Java状态设计模式
定义
状态模式是一种行为设计模式,它允许对象在内部状态发生改变时改变其行为。状态模式将与状态相关的行为抽取到独立的状态类中,让原对象将工作委派给这些类的实例,而不是自行进行处理。
对应角色
- 环境(Context):定义客户端需要的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象处理。
- 抽象状态(State):定义一个接口,用于封装与环境(Context)的一个特定状态相关的行为。
- 具体状态(Concrete State):实现抽象状态(State)接口,具体实现与环境(Context)的一个特定状态相关的行为。
优缺点
优点
- 可以将不同的状态隔离,每个状态都是一个单独的类
- 可以将各种状态的转换逻辑,分布到状态的子类中,减少相互依赖
- 增加新状态,操作简单
缺点
- 如果状态数量比较多,状态类的数量会增加,业务场景系统变得很复杂
- 如果业务中某个对象由几十上百个状态,就会很复杂,这时就需要对状态进行拆分处理
应用场景
- 一个对象的行为依赖于它的状态,并且它必须在运行时根据状态改变它的行为。
- 需要编写大量的条件分支语句来决定一个操作的行为,而且这些条件恰好表示对象的一种状态。
- 对象存在多个状态,状态可以相互转换,不同状态下,行为不同。
实例
这是一个简单的Java状态设计模式的例子。它定义了一个Context类,一个State接口和两个实现State接口的具体状态类。Context类包含一个State类型的成员变量来表示它当前的状态,并且提供了一个方法来改变状态。
interface State {public void doAction(Context context);
}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";}
}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";}
}class Context {private State state;public Context(){state = null;}public void setState(State state){this.state = state;}public State getState(){return 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());}
}