状态模式.
定义
对有状态的对象,把复杂的判断逻辑提取到不同的状态对象中,允许其状态对象在其内部状态发生改变时改变其行为;
架构
环境类:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换;
抽象状态:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为;
具体装态:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换;
应用场景
1、当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时;
2、一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时;
代码
以线程的五种状态为例:新建、就绪、运行、阻塞、死亡
State(抽象状态)
/**
*
* Description:
* 抽象状态
* 用来封装环境对象中的特定状态对应的行为,行为可以有多个
* @author: mushi
* @Date: 2021/2/21 9:14
*/
public abstract class State {
//用来改变对象的状态
public abstract void Handle(Context context);
}
Context(环境类)
/**
*
* Description:
* 环境类
* 定义客户需要的接口、内部维持一个当前状态并负责具体状态的切换
* @author: mushi
* @Date: 2021/2/21 9:16
*/
public class Context {
private State state;
//初始状态
public Context() {
this.state = new New();
}
//设置新状态
public void setState(State state) {
this.state = state;
}
//读取状态
public State getState() {
return state;
}
//修改对象当前状态
public void Handle(){
state.Handle(this);
}
}
New(新建)
public class New extends State{
@Override
public void Handle(Context context) {
System.out.println("当前处于新建状态");
//判断对象的行为设置对象的下一个状态
context.setState(new Runable());
}
}
Runable(就绪)
public class Runable extends State{
@Override
public void Handle(Context context) {
System.out.println("就绪状态");
context.setState(new Run());
}
}
Run(运行)
public class Run extends State {
@Override
public void Handle(Context context) {
System.out.println("运行状态");
context.setState(new Block());
}
}
Block(阻塞)
public class Block extends State{
@Override
public void Handle(Context context) {
System.out.println("阻塞状态");
context.setState(new Death());
}
}
Death(死亡)
public class Death extends State{
@Override
public void Handle(Context context) {
System.out.println("死亡状态");
}
}
Test
public class Test {
public static void main(String[] args) {
Context context = new Context();
for(int i = 0;i<5;i++){
context.Handle();
}
}
}
区别
看上去和责任链还有策略模式有点类似,
和责任链模式的区别:
状态模式:A处于一种状态,下一状态不固定;
责任链模式:A执行完一条职责,下一条职责是固定的,按照固定的路线执行
和策略模式的区别:
状态模式:一种状态下执行一种逻辑,一般不同状态处理不同的事件;
策略模式:多种办法解决同一件事,每个策略解决的都是一样的业务;
总结
就是将对象可能处于的状态全部分离出来封装成类,在描述状态的类中处理对象在特定状态下的行为,当行为结束后通过逻辑指定对象的下一个状态,需要有一个环境类来对对象的状态进行修改。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南