Java 状态机概述

状态机是一个重要的设计模式,用于管理对象的状态转变。在 Java 编程中,状态机不仅可以简化代码结构,还能提升系统的可维护性。本文将探讨 Java 状态机的基本概念,并通过一个代码示例来演示如何实现状态机的功能。

状态机的基本概念

状态机由一组状态、事件和转移规则组成。状态描述了系统的条件,事件是导致状态转变的触发因素,而转移规则定义了状态之间的变化逻辑。状态机通常用于处理基于状态的复杂逻辑,例如工作流、订单处理等。

简单状态机示例

下面的示例演示了一个简单的订单状态机。订单可以在 NEWPROCESSINGSHIPPEDDELIVERED 四种状态之间转换。

状态机关系图

首先,用关系图来表示这些状态及其转变:

erDiagram
    ORDER {
        string orderId
        string state
    }
    NEW --|> PROCESSING : process
    PROCESSING --|> SHIPPED : ship
    SHIPPED --|> DELIVERED : deliver
    PROCESSING --|> NEW : cancel

Java 实现

接下来,我们将实现这个状态机。在我们的示例中,会有一个 Order 类表示订单,以及一个 OrderState 接口和几个具体状态类。

// OrderState.java
public interface OrderState {
    void process(Order order);
    void ship(Order order);
    void deliver(Order order);
    void cancel(Order order);
}

// NewState.java
public class NewState implements OrderState {
    @Override
    public void process(Order order) {
        System.out.println("Processing order: " + order.getOrderId());
        order.setState(new ProcessingState());
    }
    
    // 其他方法留空或抛出异常
}

// ProcessingState.java
public class ProcessingState implements OrderState {
    @Override
    public void ship(Order order) {
        System.out.println("Shipping order: " + order.getOrderId());
        order.setState(new ShippedState());
    }

    @Override
    public void cancel(Order order) {
        System.out.println("Cancelling order: " + order.getOrderId());
        order.setState(new NewState());
    }

    // 其他方法留空或抛出异常
}

// ShippedState.java
public class ShippedState implements OrderState {
    @Override
    public void deliver(Order order) {
        System.out.println("Delivering order: " + order.getOrderId());
        order.setState(new DeliveredState());
    }

    // 其他方法留空或抛出异常
}

// DeliveredState.java
public class DeliveredState implements OrderState {
    // 此状态下可以选择终止状态机的操作
}

// Order.java
public class Order {
    private String orderId;
    private OrderState state;

    public Order(String orderId) {
        this.orderId = orderId;
        this.state = new NewState();  // 初始状态
    }

    public String getOrderId() {
        return orderId;
    }

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

    public void process() {
        state.process(this);
    }

    public void ship() {
        state.ship(this);
    }

    public void deliver() {
        state.deliver(this);
    }

    public void cancel() {
        state.cancel(this);
    }
}

类图

用类图展示各类之间的关系:

classDiagram
    class Order {
        -orderId: String
        -state: OrderState
        +process()
        +ship()
        +deliver()
        +cancel()
    }
    class OrderState {
        +process(Order order)
        +ship(Order order)
        +deliver(Order order)
        +cancel(Order order)
    }
    class NewState {
        +process(Order order)
    }
    class ProcessingState {
        +ship(Order order)
        +cancel(Order order)
    }
    class ShippedState {
        +deliver(Order order)
    }
    class DeliveredState {
    }

    Order --> OrderState
    OrderState <|-- NewState
    OrderState <|-- ProcessingState
    OrderState <|-- ShippedState
    OrderState <|-- DeliveredState

总结

通过上述示例,我们可以看到如何在 Java 中实现一个简单的状态机。状态机的设计不仅能清晰地表达对象的状态变化,还能保持代码的可读性和可维护性。此类设计模式在许多实际应用中都可发挥重要作用,比如在工作流、游戏开发和用户界面管理等领域。希望这篇文章能够帮助你更好地理解 Java 状态机的概念与实现。