17、(行为型设计模式)Java 状态模式深度学习指南

java23种设计模式-状态模式 状态模式是一种行为型设计模式,允许对象在其内部状态改变时改变它的行为。该模式将状态相关的行为封装到独立的对象中,使得对象在不同状态下表现出不同的行为。 阅读详情

以下是为你精心撰写的 《Java 状态模式深度学习指南》,专为 Java 后端开发者打造,内容涵盖:定义、作用、真实业务场景、实现方式对比、Spring 集成、避坑指南、最佳实践、面试高频题,所有示例均含中文注释,可直接用于项目重构、订单系统、审批流程等复杂状态机开发。


📘 Java 状态模式深度学习指南

—— 从“硬编码状态判断”到“对象自我驱动”的架构跃迁

作者:Java 后端架构实战导师
适用对象:Java 后端开发者(Spring Boot / 微服务 / 订单系统 / 审批流)
目标:彻底摆脱“if-else 判断状态”的噩梦,掌握对象行为随状态自动变化的终极设计模式
核心原则:“状态决定行为,行为改变状态” —— 对象自己管理自己的生命周期


✅ 一、什么是状态模式?

📌 定义:

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

🔍 核心思想:

  • 将对象的不同状态封装成独立的类(状态类)
  • 每个状态类实现相同的行为接口
  • 对象(上下文)持有当前状态的引用
  • 当状态发生转换时,对象切换内部状态对象,行为随之自动改变
  • 状态转换由状态类自己控制,而非外部逻辑判断

💡 一句话记忆:
“我不是在判断状态,我是状态本身。”

🆚 对比策略模式 vs 状态模式:

维度策略模式状态模式
目的客户端选择算法对象内部自动切换行为
控制权客户端决定用哪个策略对象自己决定下一个状态
状态是否可变策略是外部注入状态是对象内部属性
行为变化原因由外部配置触发由内部事件或条件触发
典型场景支付方式、排序算法订单状态、审批流程、游戏角色

✅ 举个生活例子:
你是一个人(上下文),你有三种状态:

  • 学生 → 行为:上课、写作业
  • 上班族 → 行为:开会、写PPT
  • 退休 → 行为:遛狗、跳广场舞

你不是由别人说“你现在是上班族了,该去开会了”,
而是你自己经历了毕业、入职、退休,内在状态变了,行为自然变了。

→ 这就是状态模式!


✅ 二、状态模式有什么作用?(Why Use State Pattern?)

作用说明
✅ 消除巨型 if-else 状态判断代码从“状态判断地狱”变成“状态类自治”
✅ 支持开闭原则(OCP)新增状态只需新增类,不改原有状态类
✅ 行为与状态解耦行为逻辑集中在状态类中,上下文只负责调度
✅ 状态转换逻辑集中状态迁移规则写在状态类内,清晰可维护
✅ 提高可读性与可测试性每个状态类独立,可单元测试
✅ 支持复杂状态机多层状态、嵌套状态、状态守卫(Guard)均可实现
✅ 避免状态污染不同状态拥有独立属性和行为,互不干扰

💡 经典名言:
“If you have a class with a lot of conditionals based on state, you probably need the State pattern.”
——《Head First Design Patterns》


✅ 三、状态模式的典型使用场景(Java 后端真实案例)

场景说明是否推荐使用状态模式
✅ 订单状态机待支付 → 已支付 → 已发货 → 已完成 → 已取消✅ 强烈推荐
✅ 合同审批流草稿 → 提交 → 部门审核 → 财务审核 → 已生效✅ 推荐
✅ 工单系统新建 → 处理中 → 已解决 → 已关闭✅ 推荐
✅ 用户账户状态激活 → 冻结 → 封禁 → 解封✅ 推荐
✅ 支付状态待支付 → 支付中 → 支付成功 → 支付失败✅ 推荐
✅ 任务调度等待执行 → 执行中 → 成功 → 失败 → 重试中✅ 推荐
✅ 游戏角色状态站立 → 跑步 → 跳跃 → 受伤 → 死亡✅ 推荐
✅ 微服务状态启动中 → 运行中 → 停止中 → 停止✅ 推荐
❌ 简单状态枚举(如 OrderStatus.WAIT_PAY)仅用于标识,无行为❌ 用枚举即可
❌ 无状态变化的业务如“计算总价”❌ 用策略模式

✅ 判断标准:
“一个对象的行为会随着它的状态改变而显著变化,且状态转换有明确规则?”
→ 是 → 用状态模式!


✅ 四、状态模式的三种实现方式详解(含中文注释)

我们从基础结构到Spring + 状态机引擎,逐步深入。


🔹 1. 基础结构:状态接口 + 多个状态类 + 上下文

/**
 * 【1】状态接口:定义所有状态共有的行为契约
 */
interface OrderState {
    void handle(OrderContext context); // 处理上下文事件
    String getStateName(); // 获取状态名称
}

/**
 * 【2】具体状态1:待支付状态
 */
class PendingPaymentState implements OrderState {
    @Override
    public void handle(OrderContext context) {
        System.out.println("⏳ 当前状态:待支付");
        System.out.println("👉 可执行操作:用户支付");
        // 仅允许支付操作,其他操作拒绝
        context.setNextState(new PaidState()); // 自动切换到“已支付”
    }

    @Override
    public String getStateName() {
        return "待支付";
    }
}

/**
 * 【3】具体状态2:已支付状态
 */
class PaidState implements OrderState {
    @Override
    public void handle(OrderContext context) {
        System.out.println("✅ 当前状态:已支付");
        System.out.println("👉 可执行操作:商家发货");
        context.setNextState(new ShippedState()); // 自动切换到“已发货”
    }

    @Override
    public String getStateName() {
        return "已支付";
    }
}

/**
 * 【4】具体状态3:已发货状态
 */
class ShippedState implements OrderState {
    @Override
    public void handle(OrderContext context) {
        System.out.println("🚚 当前状态:已发货");
        System.out.println("👉 可执行操作:用户确认收货");
        context.setNextState(new CompletedState()); // 自动切换到“已完成”
    }

    @Override
    public String getStateName() {
        return "已发货";
    }
}

/**
 * 【5】具体状态4:已完成状态
 */
class CompletedState implements OrderState {
    @Override
    public void handle(OrderContext context) {
        System.out.println("🎉 当前状态:已完成");
        System.out.println("⛔ 无法继续操作:订单已完成,不可变更");
        // 不做状态转换,保持当前状态
    }

    @Override
    public String getStateName() {
        return "已完成";
    }
}

/**
 * 【6】上下文(Context):持有当前状态,提供统一入口
 */
class OrderContext {
    private OrderState currentState; // 当前状态

    public OrderContext() {
        // 初始化为待支付状态
        this.currentState = new PendingPaymentState();
        System.out.println("📦 订单已创建,初始状态:" + currentState.getStateName());
    }

    // 设置下一状态(由当前状态调用)
    public void setNextState(OrderState nextState) {
        this.currentState = nextState;
        System.out.println("🔄 状态已切换至:" + nextState.getStateName());
    }

    // 客户端调用:触发状态行为
    public void triggerEvent() {
        System.out.println("=== 触发订单事件 ===");
        currentState.handle(this); // 状态自己决定下一步
    }

    // 获取当前状态
    public String getCurrentState() {
        return currentState.getStateName();
    }
}

/**
 * 【7】客户端:使用状态机
 */
public class StateDemo {
    public static void main(String[] args) {
        OrderContext order = new OrderContext();

        // 第一次触发:待支付 → 已支付
        order.triggerEvent();

        // 第二次触发:已支付 → 已发货
        order.triggerEvent();

        // 第三次触发:已发货 → 已完成
        order.triggerEvent();

        // 第四次触发:已完成 → 无变化
        order.triggerEvent();

        // 输出:
        // 📦 订单已创建,初始状态:待支付
        // === 触发订单事件 ===
        // ⏳ 当前状态:待支付
        // 👉 可执行操作:用户支付
        // 🔄 状态已切换至:已支付
        //
        // === 触发订单事件 ===
        // ✅ 当前状态:已支付
        // 👉 可执行操作:商家发货
        // 🔄 状态已切换至:已发货
        //
        // === 触发订单事件 ===
        // 🚚 当前状态:已发货
        // 👉 可执行操作:用户确认收货
        // 🔄 状态已切换至:已完成
        //
        // === 触发订单事件 ===
        // 🎉 当前状态:已完成
        // ⛔ 无法继续操作:订单已完成,不可变更
    }
}
✅ 优点:
  • 每个状态行为独立,职责清晰
  • 状态转换由状态类自己控制,无需外部判断
  • 新增状态只需新增类,不修改现有代码
  • 符合单一职责原则
⚠️ 缺点:
  • 状态类过多时,文件膨胀
  • 状态转换逻辑分散在多个类中,不易全局查看

🔹 2. 状态模式 + 枚举(轻量级推荐写法)

适用于状态有限、转换规则固定的场景,代码更简洁

/**
 * 【1】订单状态枚举(封装状态行为)
 */
public enum OrderStatus {
    PENDING_PAYMENT {
        @Override
        public OrderStatus next(OrderContext context) {
            System.out.println("⏳ 当前状态:待支付");
            System.out.println("👉 执行支付操作");
            return PAID; // 返回下一状态
        }
    },
    PAID {
        @Override
        public OrderStatus next(OrderContext context) {
            System.out.println("✅ 当前状态:已支付");
            System.out.println("👉 执行发货操作");
            return SHIPPED;
        }
    },
    SHIPPED {
        @Override
        public OrderStatus next(OrderContext context) {
            System.out.println("🚚 当前状态:已发货");
            System.out.println("👉 执行确认收货操作");
            return COMPLETED;
        }
    },
    COMPLETED {
        @Override
        public OrderStatus next(OrderContext context) {
            System.out.println("🎉 当前状态:已完成");
            System.out.println("⛔ 无法继续操作");
            return this; // 保持当前状态
        }
    };

    // 抽象方法:每个状态决定下一状态
    public abstract OrderStatus next(OrderContext context);

    // 获取状态名称
    public String getName() {
        return name().replace("_", " ").toLowerCase();
    }
}

/**
 * 【2】上下文:持有当前状态
 */
class OrderContext {
    private OrderStatus status;

    public OrderContext() {
        this.status = OrderStatus.PENDING_PAYMENT;
        System.out.println("📦 订单已创建,初始状态:" + status.getName());
    }

    // 触发状态流转
    public void triggerEvent() {
        System.out.println("=== 触发订单事件 ===");
        this.status = status.next(this); // 状态自己决定下一步
    }

    public String getCurrentStatus() {
        return status.getName();
    }
}

/**
 * 【3】客户端
 */
public class EnumStateDemo {
    public static void main(String[] args) {
        OrderContext order = new OrderContext();

        order.triggerEvent(); // 待支付 → 已支付
        order.triggerEvent(); // 已支付 → 已发货
        order.triggerEvent(); // 已发货 → 已完成
        order.triggerEvent(); // 已完成 → 保持

        // 输出同上,但代码更简洁!
    }
}
✅ 优点:
  • 类型安全:编译期检查状态合法性
  • 无反射:性能高
  • 不可伪造:枚举值有限,防非法状态
  • 适合简单状态机
⚠️ 缺点:
  • 状态逻辑写在枚举中,复杂逻辑难以维护
  • 无法注入 Spring Bean(如数据库服务)
💡 推荐场景:

订单状态、审批流程、游戏状态等状态少、规则固定的场景


🔹 3. 状态模式 + Spring + Spring StateMachine(企业级推荐)

使用 Spring StateMachine 框架,实现可视化状态机、持久化、事件驱动、事务支持

📦 引入依赖(Maven)
<dependency>
    <groupId>org.springframework.statemachine</groupId>
    <artifactId>spring-statemachine-core</artifactId>
    <version>3.3.0</version>
</dependency>
✅ 示例:订单状态机(Spring 配置)
/**
 * 【1】状态枚举
 */
public enum OrderState {
    PENDING_PAYMENT, // 待支付
    PAID,           // 已支付
    SHIPPED,        // 已发货
    COMPLETED       // 已完成
}

/**
 * 【2】事件枚举
 */
public enum OrderEvent {
    PAY,      // 支付事件
    SHIP,     // 发货事件
    CONFIRM   // 确认收货事件
}

/**
 * 【3】状态机配置类
 */
@Configuration
@EnableStateMachine
public class OrderStateMachineConfig extends StateMachineConfigurerAdapter<OrderState, OrderEvent> {

    @Override
    public void configure(StateMachineStateConfigurer<OrderState, OrderEvent> states) throws Exception {
        states
            .withStates()
            .initial(OrderState.PENDING_PAYMENT) // 初始状态
            .states(EnumSet.allOf(OrderState.class)); // 所有状态
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<OrderState, OrderEvent> transitions) throws Exception {
        transitions
            .withExternal()
                .source(OrderState.PENDING_PAYMENT).target(OrderState.PAID).event(OrderEvent.PAY)
                .and()
            .withExternal()
                .source(OrderState.PAID).target(OrderState.SHIPPED).event(OrderEvent.SHIP)
                .and()
            .withExternal()
                .source(OrderState.SHIPPED).target(OrderState.COMPLETED).event(OrderEvent.CONFIRM);
    }
}

/**
 * 【4】服务层:使用状态机
 */
@Service
public class OrderService {

    @Autowired
    private StateMachine<OrderState, OrderEvent> stateMachine; // Spring 自动注入

    public void processOrder(OrderState initialState) {
        // 设置初始状态
        stateMachine.getStateMachineAccessor()
            .doWithAllRegions(sma -> sma.resetStateMachine(new DefaultStateMachineContext<>(initialState, null, null, null)));

        System.out.println("📦 订单初始状态:" + stateMachine.getState().getId());

        // 模拟触发事件
        sendEvent(OrderEvent.PAY);      // 触发支付
        sendEvent(OrderEvent.SHIP);     // 触发发货
        sendEvent(OrderEvent.CONFIRM);  // 触发确认
    }

    private void sendEvent(OrderEvent event) {
        if (stateMachine.sendEvent(event)) {
            System.out.println("✅ 事件 [" + event + "] 处理成功,当前状态:" + stateMachine.getState().getId());
        } else {
            System.out.println("❌ 事件 [" + event + "] 无法处理,当前状态:" + stateMachine.getState().getId());
        }
    }
}

/**
 * 【5】启动类测试
 */
@SpringBootApplication
public class SpringStateMachineDemo {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringStateMachineDemo.class, args);
        OrderService service = context.getBean(OrderService.class);

        service.processOrder(OrderState.PENDING_PAYMENT);

        // 输出:
        // 📦 订单初始状态:PENDING_PAYMENT
        // ✅ 事件 [PAY] 处理成功,当前状态:PAID
        // ✅ 事件 [SHIP] 处理成功,当前状态:SHIPPED
        // ✅ 事件 [CONFIRM] 处理成功,当前状态:COMPLETED
    }
}
✅ 优点:
  • 可视化状态图(可生成 DOT 图)
  • 事件驱动:异步、重试、监听器支持
  • 持久化:状态可存入数据库
  • 事务支持:状态变更与业务操作在一个事务中
  • 扩展性强:支持守卫条件(Guard)、动作(Action)
💡 企业级推荐:

复杂审批流、订单系统、工作流引擎首选 Spring StateMachine!


🔹 4. 状态模式 + 注解驱动(自定义注解 + AOP 实现)

适用于不想引入外部框架,但仍想实现声明式状态管理

/**
 * 【1】自定义注解:标记状态转换规则
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface StateTransition {
    OrderState from();   // 起始状态
    OrderState to();     // 目标状态
    OrderEvent event();  // 触发事件
}

/**
 * 【2】状态机上下文
 */
@Component
public class AnnotationStateMachine {
    private OrderState currentState = OrderState.PENDING_PAYMENT;

    @StateTransition(from = OrderState.PENDING_PAYMENT, to = OrderState.PAID, event = OrderEvent.PAY)
    public void pay() {
        System.out.println("💳 支付成功,状态从【待支付】→【已支付】");
        currentState = OrderState.PAID;
    }

    @StateTransition(from = OrderState.PAID, to = OrderState.SHIPPED, event = OrderEvent.SHIP)
    public void ship() {
        System.out.println("📦 发货成功,状态从【已支付】→【已发货】");
        currentState = OrderState.SHIPPED;
    }

    @StateTransition(from = OrderState.SHIPPED, to = OrderState.COMPLETED, event = OrderEvent.CONFIRM)
    public void confirm() {
        System.out.println("✅ 确认收货,状态从【已发货】→【已完成】");
        currentState = OrderState.COMPLETED;
    }

    // 根据事件自动调用对应方法(简化版,实际可用 AOP 实现)
    public void trigger(OrderEvent event) {
        switch (event) {
            case PAY: pay(); break;
            case SHIP: ship(); break;
            case CONFIRM: confirm(); break;
            default: throw new IllegalArgumentException("未知事件:" + event);
        }
    }

    public OrderState getCurrentState() {
        return currentState;
    }
}

✅ 优点:声明式编程,代码清晰
❌ 缺点:需手动维护映射,不如 Spring StateMachine 强大


✅ 五、状态模式的避坑指南(Java 后端高频踩坑)

问题原因解决方案
❌ 用 if-else 判断状态代码臃肿,违反开闭原则✅ 改为状态模式
❌ 状态类中调用数据库导致状态类耦合严重✅ 通过上下文注入服务,状态类只调用接口
❌ 状态转换无校验可能从“已完成”跳到“待支付”✅ 在状态类中做守卫判断,或用 Spring StateMachine 的 Guard
❌ 状态枚举不封装行为只当 ID 用✅ 枚举也要实现 next() 行为
❌ 忘记初始化状态上下文状态为 null✅ 构造函数中初始化默认状态
❌ 状态转换逻辑分散难以全局查看✅ 使用 Spring StateMachine + 状态图可视化
❌ 状态变更未持久化重启后状态丢失✅ 使用 StateMachinePersister 持久化到数据库

✅ 六、状态模式 vs 策略模式 vs 工厂方法 对比

模式关注点控制权举例
工厂方法创建对象客户端选择工厂PaymentFactory.create("alipay")
策略模式执行行为客户端选择策略discountStrategy.calculate(price)
状态模式改变行为对象自己决定状态order.trigger("pay") → 自动切换状态

✅ 三者组合实战:
你用工厂方法创建一个 Order 对象,
用策略模式选择它的折扣算法,
用状态模式管理它的生命周期(待支付 → 已支付 → 已发货)
→ 三位一体,完美架构!


✅ 七、学习建议与进阶路径

阶段建议
📚 第一周将你项目中的“订单状态判断”重构为状态模式(至少3个状态)
📚 第二周用枚举状态模式重构“用户账户状态”(激活/冻结/封禁)
📚 第三周引入 Spring StateMachine,搭建一个“工单审批流程”状态机
📚 第四周阅读 Spring StateMachine 源码:StateMachineImpl 如何实现状态流转?
📚 面试准备准备回答:

“你项目中哪里用了状态模式?”
“状态模式和策略模式区别?”
“Spring StateMachine 和手写状态模式区别?”
“状态模式如何实现状态回滚?” |


✅ 八、状态模式面试高频题(附答案)

Q1:状态模式解决了什么问题?

A:解决了“对象行为随状态变化”导致的 if-else 嵌套问题,让对象自己管理状态转换。

Q2:状态模式和策略模式有什么区别?

A:

  • 策略模式:客户端主动选择行为(“我要用8折”)
  • 状态模式:对象被动响应事件,自动切换状态(“我支付了,所以变成已支付”)
    → 一个是“你选”,一个是“我变”

Q3:状态模式如何实现状态回滚?

A:

  • 在状态类中记录上一个状态
  • 实现 rollback() 方法,切换回上一状态
  • 或使用 Spring StateMachine 的 restore() + 持久化功能

Q4:状态模式适合用在哪些场景?

A:订单状态、审批流程、工单系统、游戏状态、设备状态、任务调度等有明确生命周期的场景。

Q5:为什么不用枚举 + if-else 实现状态?

A:枚举可作为状态标识,但无法封装行为,状态转换逻辑分散,不符合“单一职责”和“开闭原则”。


✅ 九、总结:状态模式选型决策树

graph TD
    A[是否需要对象行为随状态变化?] --> B{状态是否简单、固定?}
    B -->|是| C[使用枚举 + 抽象方法 next()]
    B -->|否| D{是否需要持久化、事务、事件监听?}
    D -->|是| E[使用 Spring StateMachine]
    D -->|否| F[使用接口 + 状态类 + 上下文]

✅ 最终推荐:

  • 简单状态(<5个) → ✅ 枚举 + next()(最简洁)
  • 复杂状态机(审批流、订单) → ✅ Spring StateMachine(最强大)
  • 非 Spring 项目 → ✅ 接口 + 状态类(最标准)
  • 绝对不要:if-else、switch-case、硬编码状态判断

✅ 十、结语:真正的高手,不写 if-else,而是让对象“活”起来

你不是在学“状态模式”,你是在学“如何让对象拥有生命周期”。

✅ 当你看到 order.trigger("pay"),状态自动从“待支付”变成“已支付”时,你已经掌握了面向对象的精髓。
✅ 当你用 Spring StateMachine 管理一个 10+ 状态的审批流,还能回滚、监听、持久化时,你已经是架构师了。

不要为了“用模式”而用模式,
要为了“系统可演化、可维护、可理解”而选择它。


小谈设计模式(17)—状态模式 对设计模式中状态模式进行详细解析 阅读详情

相关推荐

Java行为型设计模式-状态模式(含电梯场景示例)

状态模式)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式的目的是让状态转换显式,并且使得状态转换代码集中在一个地方,不需要使用多重条件语句。状态模式)用于解决系统中对象的行为依赖于其状态变化的问题。在状态模式中,我们将每一个状态转换到另一个状态的行为封装在一个状态类中。综上,状态模式(State Pattern)允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式的目的是让状态转换显式。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1482

Java设计模式之状态模式详解

本文详细介绍了Java设计模式中的状态模式,该模式允许对象在内部状态变化时改变行为,避免了大量条件判断语句。文章通过Mermaid类图展示了状态模式的结构,包含Context、State接口和具体状态类之间的关系。并以自动售货机为例,提供了完整的Java代码实现,包括四种状态(无硬币、有硬币、售出商品、无商品)的具体处理逻辑和状态切换机制。状态模式使代码更清晰易维护,特别适用于对象行为依赖于状态的场景。

季鸢的博客 2493

coze+飞书多维表格,批量分析小红书笔记,关键还能获取图片(附保姆级教程)

通过coze工作流,一键同步小红书账号和笔记链接到飞书多维表格,效率飞升~

qq_24403067的博客 4173

【Java 设计模式】行为型之状态模式

状态模式是一种行为型设计模式,用于通过将对象的行为封装到不同的状态类中,使得对象在不同的状态下具有不同的行为。状态模式允许对象在内部状态发生改变时改变其行为,而无需修改其代码。状态模式通常包含三个主要角色:上下文(Context)、抽象状态(Abstract State)和具体状态(Concrete State)。定义了一个接口,用于维护一个当前状态的引用,并提供一个用于切换状态的方法定义了一个接口,用于封装与上下文相关的一个或多个行为实现了抽象状态的接口,负责处理与状态相关的行为。

好久不见的流星 2111

光伏发电预测(LSTM、CNN_LSTM和XGBoost回归模型,Python代码)

一旦结果与预测差距较大,可能存在光伏系统的问题,需要找出原因,然后采取适当措施来修复光伏系统并做出更好的决策。例如,根据准确的预测,光伏系统运营商可以平衡电力消耗,并将多余的电力储备用于紧急情况。然而,光伏系统的发电量估算是一个挑战,因为光伏系统的发电量受到天气条件的极大影响。整个项目文件夹(第一个文件夹为xgboost模型相关的包文件,xg.py是xgboost模型英文注释版本,xg_chinese.py是xgboost模型中文注释版本)表示空气的温度,通常以摄氏度(°C)或华氏度(°F)为单位。

2301_79699110的博客 3030

AI使用指南:6个超实用的Prompt提示词模板

最近越来越多人开始接触AI,但其实想要让AI更懂你,关键是掌握对的提示词模板!今天就给大家分享6种超实用的Prompt提示词模板,不管你是小白还是老手都能用

程序员世杰 8166

设计模式--状态模式【行为型模式】

状态设计模式(State Design Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变它的行为,这个模式将状态封装成独立的类,并将行为的实现委托给当前状态对象,使得对象的行为可以随着状态的变化而动态改变,也就是状态和行为分离。

weixin_42118323的博客 1269

ONNX Runtime C# YOLO全链路压测:从300ms到22ms的15个底层优化技巧

摘要:本文分享了工业质检场景下C#调用YOLOv8s ONNX模型的性能优化实战经验。原始单帧推理耗时300ms无法满足产线需求,通过全链路分析定位瓶颈(预处理85ms、推理180ms、后处理30ms)。重点优化措施包括:使用OpenCVSharp CUDA加速预处理(85ms→12ms),开启ONNX Runtime ALL级别图优化,选用TensorRT执行提供程序(180ms→22ms),以及优化内存管理和线程调度。最终实现单帧总耗时22ms±2ms,GPU利用率提升至85%,完整满足产线120块板/

2601_94871597的博客 401

Java23种设计模式——17.行为型模式之状态模式

Java中除去有设计原则之外,还有23中设计模式。 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题。 并且在这些模式中,可以说是将语言的使用体现的淋漓尽致。 那我们今天要学习行为型模式中的状态模式 ! 状态模式 我们先来看看什么叫做状态模式 我们可以通过百科了解到,状态模式是可以让一个对象内部状态改变,然后改变它的行为,这样对象看起来修改了它的类,可能说起来比较抽象,我们举一个例子 就用天气来说,天气可以有晴天、有下雨天、刮...

胖子胖子大胖子的博客 1064

JeecgBoot passwordChange 任意用户密码重置漏洞复现

​JeecgBoot 框架passwordChange接口存在任意用户密码重置漏洞,未经身份验证的远程攻击者可以利用此漏洞重置管理员账户密码,从而接管系统后台,造成信息泄露,导致系统处于极不安全的状态。

0xSec 2641

DSPy 入门: 再见提示,你好编程

DSPy("Declarative Self-improving Language Programs (in Python)",发音为 "dee-es-pie")[1] 是斯坦福大学 NLP 研究人员开发的 "基础模型编程 "框架。它强调编程而非提示,并将构建基于 LM 的管道从操作提示转向编程。因此,它旨在解决构建基于 LM 应用程序时的脆弱性问题。DSPy 还将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。

具身机器人和通用AI 3480

Java 设计模式系列:行为型-状态模式

状态模式(State Pattern)是一种行为型设计模式,允许一个对象在其内部状态改变时改变其行为。状态模式中类的行为是由状态决定的,在不同的状态下有不同的行为。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。适用场景:一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为;一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

程序人生 1370

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 108

从零开始学习Java设计模式 | 行为型模式篇:状态模式

在本讲,我们来学习一下行为型模式里面的第五个设计模式,即状态模式。 状态模式引入案例 在学习状态模式之前,我们先来看一个案例,通过该案例来引出状态模式。 这个案例就是通过电梯按钮来控制一个电梯的状态。一个电梯有开门状态、关门状态、停止状态、运行状态等四种状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,那么就不能进行开门操作。为什么呢?你想啊,现在电梯正处于运行状态呢,然后门开了,这是不是非常危险呀!所以,当电梯处于运行状态时是不允许执行开门操作的。而如果电梯门是停

李阿昀的博客 1651

激光除草技术原理与应用全解析

激光除草技术通过光热、光化学等效应精准破坏杂草组织,核心参数包括功率(20-6000W)、波长(400nm-10.6μm)和脉冲宽度。主要应用于大田作物(如玉米、棉花)、经济作物(烟草、果树)及城市绿化,具有环保(无化学污染)、高效(识别率≥95%)和非接触等优势,但存在设备成本高(20-50万元)、技术门槛高等局限。当前技术融合AI识别、多光谱协同等创新,国产设备如华工智耘已实现95.3%识别精度。虽短期投入较高,但长期可降低30%除草成本,并带来环境效益(每亩减排1.2吨CO₂)

start_up_go的博客 556

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java状态模式详解_详解JAVA 设计模式之状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。介绍意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。何时使用:代码中包含大量与...

weixin_33508642的博客 292

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用...

walkerwqp的博客 665

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java 状态模式详解

状态模式是一种通过将对象的状态转换逻辑分布到状态对象中来实现状态转换的设计模式。它将对象的行为与对应的状态分离,使得在修改对象状态时,不需要修改对象的行为方法。同时,状态模式可以通过将状态的转换逻辑包含在各个状态类中来简化代码,避免出现大量的条件判断语句,从而提高代码的可读性和可维护性。环境(Context):它定义了客户端所感兴趣的接口,并维护一个当前状态,在具体状态类中实现该接口的各个具体操作。抽象状态(State):它定义了一个接口,用于封装环境对象中不同状态对应的行为。

兴趣是最好的老师,勤能补拙 2459

十八、行为型(状态模式)

这个模式将状态的相关行为封装在独立的状态类中,使得状态之间的切换更加灵活。:当一个对象的行为依赖于其状态,并且可能会在运行时改变其状态时,使用状态模式可以清晰地管理这些状态及其行为。:在用户界面设计中,组件的状态(如启用、禁用、显示、隐藏)会影响其行为,状态模式可以帮助管理这些状态变化。:在一些工作流系统中,任务的状态可能会频繁变化,使用状态模式可以有效地管理不同状态下的任务行为。在某些情况下,状态之间的转换规则可能会更复杂,您可以在状态类中引入条件判断来决定下一个状态。

xiaoqi270620903的专栏 1152

行为型设计模式2

访问者设计模式(Visitor Pattern)是一种行为型设计模式,它允许你在不修改现有类结构的情况下,为类添加新的操作。这种模式可以实现良好的解耦和扩展性,尤其适用于在现有类层次结构中添加新功能的情况。访问者模式主要包含以下角色:访问者(Visitor):定义一个访问具体元素的接口,为每种具体元素类型声明一个访问操作。具体访问者(ConcreteVisitor):实现访问者接口,为每种具体元素提供具体的访问操作实现。元素(Element):定义一个接口,声明接受访问者的方法。

空 1502

Java设计模式:行为型模式→状态模式

Java设计模式:行为型模式→状态模式 详解

专注分享技术、实用优质教程、资源 1833

瑞_23种设计模式_状态模式

本文章为瑞_系列专栏之《23种设计模式》的状态模式篇。状态模式可用于简化复杂的条件语句(如一个操作中含有庞大的分支结构,即长的 if-else 链或 switch case),并且这些分支决定于对象的状态。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 2333

【设计模式】【行为型模式】状态模式(State)

状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将行为委托给代表当前状态的对象。消除复杂的条件语句:状态模式将状态相关的行为分散到各个状态类中,避免了大量的if-else或语句,使代码更加清晰。符合开闭原则:新增状态时,只需添加新的状态类,而无需修改现有代码。修改某个状态的行为时,只需修改对应的状态类,不会影响其他状态。提高代码的可读性和可维护性。

flzjkl的博客 1271

Java设计模式之《状态模式》

状态模式是一种行为型设计模式,允许对象在内部状态改变时改变其行为。它通过将状态封装为独立类来解决if-else判断的弊端,实现开闭原则。文章对比了传统if-else实现与状态模式实现,展示了状态模式在订单系统等场景的优势:解耦状态和行为、可扩展性强、避免条件语句膨胀。同时提供了优化方案,如使用集合管理状态流转,使业务流程可配置化。状态模式适用于状态多且变化频繁的系统,但也可能增加系统复杂度。总体而言,该模式能有效管理复杂状态转换逻辑。

weixin_50055999的博客 1357

【设计模式】行为型模式(三):责任链模式、状态模式

状态模式(State)是一种行为设计模式,它允许一个对象在其内部状态改变时改变其行为。简单来说,就是让对象的行为随着其状态的变化而变化。这样可以避免大量的条件判断语句,使代码更加清晰和易于维护。

Data · Model · Agent · Repeat 1712

Java设计模式 —— 【行为型模式】状态模式(State Pattern) 详解

应用程序中的有些对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态会发生改变,从而使得其行为也随之发生改变。

知唔猪的博客 1134
上一篇: 12、(行为型设计模式)Java 策略模式深度学习指南
下一篇: 7、(创建型设计模式)Java 建造者模式深度学习指南
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值