状态模式
类型:行为型模式
实现原理:创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。
作用:允许对象在内部状态发生改变时改变它的行为看起来好像修改了它的类。
解决的问题:对象在不同状态下需要有不同的行为,而且这些行为可能会随着状态的改变而改变
何时使用:对象状态变化频繁时
解决的方式:将各种具体的状态类抽象出来。
实现核心:通过使用接口或抽象类定义状态类的公共方法,并在每个具体状态类中实现这些方法
应用实例* 线程状态管理:多线程中,线程可以处于不同的状态,如运行、阻塞、等待等
优点: 1、封装了转换规则。 2、枚举可能的状态 3、一个类单独放与一个状态有关的行为,可以方便地增加新的状态,改变对象状态即可改变对象的行为。4、让多个环境对象共享一个状态对象,减少系统中对象的个数。
缺点: 1、必然会增加系统类和对象的个数。 2、使用不当将导致程序结构和代码的混乱。 3、对"开闭原则"的支持程度低
使用场景: 1、行为随状态改变而改变的场景。 2、代替条件、分支语句
实现
步骤 1
创建一个接口。
State.java
public interface State {
public void doAction(Context context);
}
步骤 2
创建实现接口的实体类。
StartState.java
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";
}
}
StopState.java
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 类。
Context.java
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 改变时的行为变化。
StatePatternDemo.java
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
这是一个使用状态模式的示例代码。状态模式用于根据对象的内部状态来改变其行为。下面对代码进行逐步解释:
步骤1:创建一个接口State,定义了一个名为doAction的方法。
步骤2:创建两个实现接口State的实体类StartState和StopState。它们分别表示开始状态和停止状态,并实现了doAction方法来改变上下文(Context)的状态。
步骤3:创建Context类,它保存了当前的状态,并提供了设置状态和获取状态的方法。
步骤4:使用Context类来查看当状态改变时的行为变化。在StatePatternDemo类中,首先创建一个Context对象,并创建一个StartState对象来设置上下文的状态为开始状态,然后打印当前状态。接着,创建一个StopState对象来设置上下文的状态为停止状态,再次打印当前状态。
步骤5:执行程序,输出结果为"Player is in start state"、"Start State"、"Player is in stop state"和"Stop State",显示了状态的改变和对应的行为。
这段代码展示了状态模式的基本结构和用法,通过将状态封装成独立的对象,使得对象状态的改变可以独立于对象的行为。