行为型模式-状态模式

状态模式(State Pattern)是行为型设计模式之一,用于允许一个对象在其内部状态改变时改变其行为。状态模式可以有效避免在对象中使用大量的条件语句,通过将状态的逻辑转移到独立的状态类中,实现状态与行为的分离。

核心思想

将对象的状态抽象为单独的类,使得对象的行为随着其状态变化而发生变化。状态模式的主要目的是让状态切换更加灵活、清晰,且更易于维护。

组成

  • Context(上下文)

    持有当前状态的引用,并提供行为接口以供外部调用。上下文会将请求委托给当前状态对象处理。

  • State(抽象状态类)

    定义状态对应的行为接口,具体状态类需实现该接口。

  • ConcreteState(具体状态类)

    实现抽象状态类中的行为,每个类对应一个具体状态。

优缺点

  • 优点
    避免了大量的条件语句或分支逻辑。
    易于扩展新状态,通过新增状态类而非修改已有代码实现开闭原则。
    状态切换更加灵活,符合单一职责原则。
  • 缺点
    增加了系统复杂性,需要引入多个状态类。
    可能会导致类的数量增多。
java 复制代码
// 抽象状态类
public interface OrderState {
    void handle();
}

// 具体状态类:待支付
public class PendingState implements OrderState {
    @Override
    public void handle() {
        System.out.println("订单处于待支付状态。");
    }
}

// 具体状态类:已支付
public class PaidState implements OrderState {
    @Override
    public void handle() {
        System.out.println("订单处于已支付状态。");
    }
}

// 具体状态类:已完成
public class CompletedState implements OrderState {
    @Override
    public void handle() {
        System.out.println("订单已完成。");
    }
}

// 上下文类
public class OrderContext {
    private OrderState state;

    // 设置状态
    public void setState(OrderState state) {
        this.state = state;
    }

    // 调用当前状态对应的行为
    public void handle() {
        if (state != null) {
            state.handle();
        }
    }
}

// 测试
public class Main {
    public static void main(String[] args) {
        OrderContext context = new OrderContext();

        // 设置为待支付状态
        context.setState(new PendingState());
        context.handle();

        // 设置为已支付状态
        context.setState(new PaidState());
        context.handle();

        // 设置为已完成状态
        context.setState(new CompletedState());
        context.handle();
    }
}

适用场景

一个对象的行为随状态变化而变化时。

避免过多的条件分支逻辑。

状态数量较多且需要频繁切换时。

如果你对实现细节或设计场景有更多问题,随时告诉我!

相关推荐
LiuYaoheng9 分钟前
【Android】View 的基础知识
android·java·笔记·学习
勇往直前plus17 分钟前
Sentinel微服务保护
java·spring boot·微服务·sentinel
星辰大海的精灵17 分钟前
SpringBoot与Quartz整合,实现订单自动取消功能
java·后端·算法
小鸡脚来咯20 分钟前
一个Java的main方法在JVM中的执行流程
java·开发语言·jvm
江团1io021 分钟前
深入解析三色标记算法
java·开发语言·jvm
天天摸鱼的java工程师29 分钟前
RestTemplate 如何优化连接池?—— 八年 Java 开发的踩坑与优化指南
java·后端
你我约定有三33 分钟前
java--泛型
java·开发语言·windows
杨杨杨大侠40 分钟前
第3章:实现基础事件总线
java·github·eventbus
杨杨杨大侠42 分钟前
第4章:添加注解支持
java·github·eventbus
咖啡Beans1 小时前
异步处理是企业开发的‘生存之道’!Java8和Spring的异步实现,你必须搞清楚!
java·后端