侧边栏壁纸
博主头像
拾荒的小海螺博主等级

只有想不到的,没有做不到的

  • 累计撰写 224 篇文章
  • 累计创建 19 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

JAVA: 状态模式(State Pattern)的技术指南

拾荒的小海螺
2025-03-04 / 0 评论 / 0 点赞 / 12 阅读 / 5642 字

1、简述

状态模式是一种行为型设计模式,允许对象在其内部状态改变时改变其行为。它将状态相关的行为抽取到独立的状态类中,使得增加新状态变得简单,且不影响其他状态。

设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git

本文将详细介绍状态模式的概念、结构、优缺点,以及实际应用案例。

image-ejlx.png


2、什么是状态模式?

状态模式通过将对象的行为与其内部状态解耦,来实现行为的动态切换。它通过引入一系列状态类,每个类封装一种状态下的行为。

典型应用场景包括:

  • 文件下载状态管理(开始、暂停、完成)。
  • 游戏角色状态(攻击、移动、防御)。
  • 工作流管理(审批状态)。

状态模式包含以下角色:

  • 上下文(Context):维护状态实例,定义客户端与状态的交互接口。
  • 状态(State):定义状态的公共接口。
  • 具体状态(ConcreteState):实现特定状态下的行为。

类图:

Context <--> State <--> ConcreteState

3、实际案例

假设我们需要管理订单的状态,包括:待支付已支付已完成

// 状态接口
public interface OrderState {
    void handleOrder();
}

// 具体状态类
public class PendingState implements OrderState {
    @Override
    public void handleOrder() {
        System.out.println("订单状态:待支付。请完成支付!");
    }
}

public class PaidState implements OrderState {
    @Override
    public void handleOrder() {
        System.out.println("订单状态:已支付。订单处理中。");
    }
}

public class CompletedState implements OrderState {
    @Override
    public void handleOrder() {
        System.out.println("订单状态:已完成。感谢您的购买!");
    }
}

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

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

    public void processOrder() {
        if (state != null) {
            state.handleOrder();
        } else {
            System.out.println("订单状态未设置。");
        }
    }
}

// 测试类
public class StatePatternDemo {
    public static void main(String[] args) {
        OrderContext order = new OrderContext();

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

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

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

输出:

订单状态:待支付。请完成支付!
订单状态:已支付。订单处理中。
订单状态:已完成。感谢您的购买!

4、状态模式的高级应用

电梯可以有以下状态:停止、运行、维护。

// 状态接口
public interface ElevatorState {
    void performAction();
}

// 具体状态类
public class StoppedState implements ElevatorState {
    @Override
    public void performAction() {
        System.out.println("电梯已停止,等待指令。");
    }
}

public class RunningState implements ElevatorState {
    @Override
    public void performAction() {
        System.out.println("电梯正在运行。");
    }
}

public class MaintenanceState implements ElevatorState {
    @Override
    public void performAction() {
        System.out.println("电梯处于维护模式。");
    }
}

// 上下文类
public class Elevator {
    private ElevatorState state;

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

    public void operate() {
        if (state != null) {
            state.performAction();
        } else {
            System.out.println("电梯状态未设置。");
        }
    }
}

// 测试类
public class ElevatorDemo {
    public static void main(String[] args) {
        Elevator elevator = new Elevator();

        // 设置为停止状态
        elevator.setState(new StoppedState());
        elevator.operate();

        // 设置为运行状态
        elevator.setState(new RunningState());
        elevator.operate();

        // 设置为维护状态
        elevator.setState(new MaintenanceState());
        elevator.operate();
    }
}

输出:

电梯已停止,等待指令。
电梯正在运行。
电梯处于维护模式。

5、状态模式的优缺点

优点

  • 代码清晰:将状态逻辑分散到不同的状态类中,减少了上下文类的复杂性。
  • 扩展性强:添加新状态只需新增状态类,无需修改现有代码。
  • 遵循开闭原则:状态的变化对其他状态透明。

缺点

  • 类数量增加:每种状态都需要创建一个具体状态类。
  • 上下文与状态耦合:上下文需要与具体状态进行交互。

6、应用场景

  • 工作流管理:根据状态切换执行不同操作。
  • 游戏开发:角色、任务等状态管理。
  • 设备控制:电梯、交通信号灯等。

7、总结

状态模式通过将状态与行为分离,使得复杂状态逻辑的管理变得简单易扩展。在需要频繁切换状态且状态行为差异较大的场景中,状态模式是一种非常实用的设计模式。

希望本文对您理解和应用状态模式有所帮助!欢迎交流讨论!

0

评论区