状态模式.

定义

对有状态的对象,把复杂的判断逻辑提取到不同的状态对象中,允许其状态对象在其内部状态发生改变时改变其行为;

架构

环境类:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换;
抽象状态:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为;
具体装态:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换;

应用场景

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执行完一条职责,下一条职责是固定的,按照固定的路线执行
和策略模式的区别
状态模式:一种状态下执行一种逻辑,一般不同状态处理不同的事件;
策略模式:多种办法解决同一件事,每个策略解决的都是一样的业务;

总结

就是将对象可能处于的状态全部分离出来封装成类,在描述状态的类中处理对象在特定状态下的行为,当行为结束后通过逻辑指定对象的下一个状态,需要有一个环境类来对对象的状态进行修改。

posted @   有锦  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示