
Java状态模式是常用的Java设计模式,下面我重点详解Java状态模式的角色实现与应用场景@mikechen
Java状态模式定义
Java状态模式是一种行为型设计模式,它允许一个对象在其内部状态发生改变时改变它的行为。
Java状态模式应用场景
Java 状态模式常常应用于以下场景中:
1.对象在不同状态下具有不同的行为
例如:一个订单在不同状态下,需要执行不同的处理逻辑,例如:待付款、待发货、已发货等场景,就比较适合Java状态模式。
2.一个对象的状态可以在运行时动态切换
例如:一个电视机的状态可以是开启、关闭、静音等,每个状态都对应一组固定的行为,例如:开启状态下可以调整音量、切换频道等。
3.对象的行为具有状态依赖性
例如:一个线程在不同的状态下,需要执行不同的操作。例如:新建状态下需要调用 start() 方法启动线程,终止状态下需要调用 stop() 方法停止线程等。
Java状态模式组件角色
Java状态模式类图实现,主要包含以下主要角色:

1.环境(Context)
环境角色通常包含:一个或多个状态角色,可以通过调用状态角色的方法来改变环境的状态和执行相应的操作。
2.抽象状态(State)
抽象状态是一个接口或抽象类,抽象状态通常包含一个或多个方法,用于处理当前状态下的行为。
3.具体状态(Concrete State)
具体状态是抽象状态的实现,具体状态可以在环境的运行时动态切换,从而改变环境的行为。
Java状态模式实现例子
下面是一个简单的 Java 状态模式的示例,包含上述三种角色:
// 抽象状态
public interface State {
void handle(Context context);
}
// 具体状态1
public class ConcreteState1 implements State {
@Override
public void handle(Context context) {
// 处理具体状态1的行为
System.out.println("Handling in ConcreteState1");
// 切换到具体状态2
context.setState(new ConcreteState2());
}
}
// 具体状态2
public class ConcreteState2 implements State {
@Override
public void handle(Context context) {
// 处理具体状态2的行为
System.out.println("Handling in ConcreteState2");
// 切换到具体状态1
context.setState(new ConcreteState1());
}
}
// 环境
public class Context {
private State state;
public Context() {
state = new ConcreteState1(); // 初始状态为具体状态1
}
public void setState(State state) {
this.state = state;
}
public void request() {
state.handle(this); // 根据当前状态执行相应的操作
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.request(); // Output: Handling in ConcreteState1
context.request(); // Output: Handling in ConcreteState2
context.request(); // Output: Handling in ConcreteState1
}
}
在上面的示例中:
- State 是抽象状态,定义了具体状态所需实现的 handle 方法;
- ConcreteState1 和 ConcreteState2 是具体状态,实现了 State 接口,并根据当前状态执行相应的操作;
- Context 是环境角色,包含一个状态成员变量,用于存储当前状态,并根据状态执行相应的操作;
以上就是Java状态模式详解,更多内容请查看:Java设计模式:23种设计模式(万字图文全面总结)
mikechen睿哥
10年+一线大厂架构实战经验,就职于阿里、淘宝等一线大厂,操盘多个亿级大厂核心项目。