状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为,看起来好像改变的是这个对象的类。
状态模式经常用在带有状态的对象中。
什么是状态?假设一个对象,有如下三种状态:
- 开始状态
- 运行状态
- 结束状态
定义一个枚举类,表示不同的状态,但是不同的状态需要表现不同的行为,如下:
scss
if(state == START){
// 执行开始状态下逻辑
}else if(state == RUNNABLE){
// 执行运行状态下逻辑
}else if(state == STOP){
// 执行结束状态下逻辑
}
状态模式设计的目的是为了把上述一大堆 if else
代码拆分为不同的状态,然后封装成不同的状态类,使得将来增加状态比较容易。
接下来,使用状态模式优化上述代码。
定义状态接口:
csharp
// 定义状态接口
interface State {
void doAction(Context context);
}
对于开始状态,设计如下:
typescript
// 开始状态类
class StartState implements State {
@Override
public void doAction(Context context) {
System.out.println("Start State");
context.setState(new RunState());
}
}
对于运行状态,设计如下:
typescript
// 运行状态类
class RunState implements State {
@Override
public void doAction(Context context) {
System.out.println("Run State");
context.setState(new StopState());
}
}
对于停止状态,设计如下:
typescript
// 停止状态类
class StopState implements State {
@Override
public void doAction(Context context) {
System.out.println("Stop State");
context.setState(new StartState());
}
}
状态模式设计的关键设计思想在于状态切换,我们引入一个context
负责状态管理:
typescript
class Context {
private State state;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void doAction() {
state.doAction(this);
}
}
这样,就完成了一个状态模式的实现,测试下效果:
typescript
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context();
context.setState(new StartState());
context.doAction(); // Start State -> Run State
context.doAction(); // Run State -> Stop State
context.doAction(); // Stop State -> Start State
}
}
总结
状态模式的设计思想在于把不同的状态逻辑拆分封装到不同的状态类中,从而使得后续增加新状态更容易。
状态模式的实现关键在于状态的切换。状态既可以由调用方负责切换,也可以在状态内部自己根据不同条件完成切换。