Java 状态机实现指南

在实际开发中,状态机是一种有效的工具,可以帮助我们处理有状态的系统,如订单处理、用户状态管理等。对于刚入行的小白而言,了解如何实现一个简单的 Java 状态机是至关重要的。接下来,我们将逐步实现这一功能。

实现流程

下面是实现 Java 状态机的基本流程:

步骤 描述
1 定义状态枚举
2 定义事件枚举
3 创建状态机类
4 实现状态转换逻辑
5 测试状态机

详细步骤及代码

1. 定义状态枚举

状态枚举可以帮助我们清晰地定义所有可能的状态。

public enum OrderState {
    NEW,       // 新订单
    PROCESSING,// 处理中
    COMPLETED, // 已完成
    CANCELED   // 已取消
}

2. 定义事件枚举

事件枚举定义了可能导致状态变化的所有事件。

public enum OrderEvent {
    PROCESS,   // 处理订单
    COMPLETE,  // 完成订单
    CANCEL     // 取消订单
}

3. 创建状态机类

在这个类中,我们将管理状态和事件之间的转换。

import java.util.HashMap;
import java.util.Map;

public class OrderStateMachine {
    private OrderState currentState;

    // 状态转移图
    private final Map<OrderState, Map<OrderEvent, OrderState>> transitions;

    public OrderStateMachine() {
        this.currentState = OrderState.NEW; // 初始状态

        transitions = new HashMap<>();
        
        // 定义状态转换关系
        addTransition(OrderState.NEW, OrderEvent.PROCESS, OrderState.PROCESSING);
        addTransition(OrderState.PROCESSING, OrderEvent.COMPLETE, OrderState.COMPLETED);
        addTransition(OrderState.PROCESSING, OrderEvent.CANCEL, OrderState.CANCELED);
    }

    private void addTransition(OrderState from, OrderEvent event, OrderState to) {
        transitions
          .computeIfAbsent(from, k -> new HashMap<>())
          .put(event, to);
    }
}

4. 实现状态转换逻辑

添加一个方法用于处理事件并进行状态转换。

public OrderState handleEvent(OrderEvent event) {
    Map<OrderEvent, OrderState> eventMap = transitions.get(currentState);

    if (eventMap != null && eventMap.containsKey(event)) {
        currentState = eventMap.get(event); // 更新当前状态
    }
    
    return currentState; // 返回新状态
}

5. 测试状态机

下面是测试状态机的示例代码。

public class Main {
    public static void main(String[] args) {
        OrderStateMachine order = new OrderStateMachine();

        System.out.println("当前状态: " + order.handleEvent(OrderEvent.PROCESS)); // 处理订单
        System.out.println("当前状态: " + order.handleEvent(OrderEvent.COMPLETE)); // 完成订单
    }
}

状态机之旅 & 实体关系图

状态机之旅

下面是状态机的工作流程:

journey
    title 订单处理状态机
    section 状态转换
      新订单 -> 处理中: 处理订单
      处理中 -> 已完成: 完成订单
      处理中 -> 已取消: 取消订单

实体关系图

下面是状态机的类关系示意图:

erDiagram
    ORDER_STATE {
        ENUM NEW
        ENUM PROCESSING
        ENUM COMPLETED
        ENUM CANCELED
    }
    ORDER_EVENT {
        ENUM PROCESS
        ENUM COMPLETE
        ENUM CANCEL
    }
    ORDER_STATE_MACHINE {
        ORDER_STATE currentState
        MAP<ORDER_STATE, MAP<ORDER_EVENT, ORDER_STATE>> transitions
    }

结尾

通过以上步骤,我们实现了一个基本的 Java 状态机。您能够定义状态和事件、管理状态转换并测试状态机的工作。在深入学习之后,您可以探索更复杂的状态机设计,例如引入持久化、并发处理等功能。希望这篇文章能够帮助您在 Java 开发路上更进一步。