23种设计模式-状态(State)设计模式

状态设计模式

🚩什么是状态设计模式?

状态设计模式(State Pattern) 是一种 行为型设计模式 ,它允许对象在 内部状态改变时改变其行为,看起来就像改变了它的类。

使用场景

  • 有限状态机(如贩卖机、订单状态管理、流程控制等)

  • 状态切换(如任务状态、权限控制、游戏角色状态等)

  • 减少 if-else 逻辑,使代码更清晰

🚩状态设计模式的特点

  • 封装状态:将状态封装为独立的类,使得状态切换更加清晰。

  • 消除大量 if-else 语句,提高代码的可维护性。

  • 状态与行为绑定,对象的行为取决于当前状态。

  • 遵循开闭原则,增加新状态时无需修改已有代码。

🚩状态设计模式的结构

状态模式主要由以下角色组成:

  • Context(上下文):维护当前状态,并定义状态切换的方法。

  • State(状态接口):定义所有具体状态的公共接口。

  • ConcreteState(具体状态类):实现 State 接口,并定义当前状态下的行为。

图例:

🚩状态设计模式的优缺点

✅ 优点

  • 减少 if-else 语句,提高代码的可读性和可维护性。

  • 状态变化时可以方便地扩展 ,符合 开闭原则

  • 将状态与具体行为解耦,使代码更清晰。

❌ 缺点

  • 类的数量增加,每个状态都需要单独定义一个类。

  • 如果状态过多,可能导致状态类泛滥。

🚩状态设计模式的Java实现

代码地址:GitHub

  • 创建状态接口State
java 复制代码
/**
 * @author hanso
 * @description: 状态接口
 * @date 2025-03-26 00:20:37
 * @version: 1.0
 */
public interface State {
    public void Handle(Context context);
}
  • 定义两个具体的状态类型StateAStateBStateA表示有货,StateB表示无货

    • StateA
    java 复制代码
    /**
     * @author hanso
     * @description: 状态A 有货
     * @date 2025-03-26 00:22:37
     * @version: 1.0
     */
    public class StateA implements State { // 有货
        @Override
        public void Handle(Context context) {
            int count = context.getCount();
    
            if (count >= 1) {
                System.out.println("购买成功!");
                context.setCount(count - 1);
    
                if (context.getCount() == 0){
                    context.setState(new StateB());
                }
            } else {
                System.out.println("购买失败!");
            }
        }
    }
    • StateB
    java 复制代码
    /**
     * @author hanso
     * @description: 状态B 无货
     * @date 2025-03-26 00:24:22
     * @version: 1.0
     */
    public class StateB implements State { // 无货
        @Override
        public void Handle(Context context) {
            int count = context.getCount();
    
            if (count == 0) {
                System.out.println("购买失败!等待补货");
    
                context.setCount(5);
                System.out.println("补货成功,请重新购买");
                context.setState(new StateA());
            }
        }
    }
  • 创建上下文Context

java 复制代码
/**
 * @author hanso
 * @description: 上下文
 * @date 2025-03-26 00:21:08
 * @version: 1.0
 */
public class Context {// 贩卖机
    private int count;

    private State state;

    public Context() {
        count = 3;
        state = new StateA();
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void Request() { // 购买一个饮料
        state.Handle(this);
    }
}
  • 测试状态设计模式
java 复制代码
/**
 * @author hanso
 * @description: 测试状态模式
 * @date 2025-03-26 00:25:38
 * @version: 1.0
 */
public class StatePattern {
    public static void main(String[] args) {
        Context context = new Context(); // count:3

        System.out.println(context.getState());

        context.Request(); // 购买一个饮料 count = 2
        context.Request(); // 购买一个饮料 count = 1
        context.Request(); // 购买一个饮料 count = 0

        System.out.println(context.getState());

        context.Request(); // 无货 等待补货 补货成功 count = 5

        System.out.println(context.getState());

        context.Request(); // 购买一个饮料 count = 4
        System.out.println(context.getCount());
    }
}

📌 运行结果

🚩代码总结

  • Context(上下文) 负责维护当前状态,并根据状态调用不同的行为。

  • State(状态接口) 定义了所有具体状态需要实现的方法。

  • StateA 和 StateB(具体状态类) 定义了不同状态下的行为。

  • 状态切换 发生在 Handle() 方法中,当满足特定条件时,状态转换。

🚩总结

  • 状态模式适用于有限状态机、任务管理等场景。

  • 消除了 if-else 逻辑,使代码更加清晰。

  • 状态变更时,只需新增状态类,不影响已有代码。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关推荐
孫治AllenSun4 分钟前
【Maven】手动安装依赖到本地仓库
java·maven
MacroZheng9 分钟前
斩获10k star!这款开源的项目管理工具,能让你的开发效率翻倍!
java·spring boot·后端
Code哈哈笑9 分钟前
【Spring Boot基础】MyBatis的基础操作:日志、增删查改、列名和属性名匹配 -- 注解实现
java·spring boot·后端·spring·mybatis
啊阿狸不会拉杆10 分钟前
数据结构-数组与广义表
java·c语言·数据结构·c++·python·算法
爱的叹息13 分钟前
【java实现+4种变体完整例子】排序算法中【冒泡排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
java·算法·排序算法
Minyy1131 分钟前
SSM(SpringMVC+spring+mybatis)整合的步骤以及相关依赖
java·后端·spring·servlet·maven·intellij-idea·mybatis
牛奶咖啡1336 分钟前
学习设计模式《四》——单例模式
单例模式·设计模式·饿汉式单例·懒汉式单例·线程安全的单例·可控制实例数量的单例·何时使用单例模式
人工智能那些事儿41 分钟前
神经网络:从基础到应用,开启智能时代的大门
java·人工智能·python·深度学习·神经网络·算法·机器学习
MiniFlyZt1 小时前
分布式数据库TiDB:架构、核心特性与生产实践(分库分表)
java·数据库·分布式·spring cloud·微服务·tidb
zzx_nihao1 小时前
Java29:Spring MVC
java·spring·mvc