个人技术分享

1.什么是状态机

状态机(State Machine)是一种抽象的计算模型,用于描述一个系统在不同状态之间的转换以及触发这些转换的事件。它由状态、事件、动作和转换规则组成。状态代表系统在某个时刻的行为模式;事件是引起状态转换的外部或内部信号;动作是在状态转换时执行的操作;转换规则定义了在接收到特定事件后,系统如何从一个状态转移到另一个状态。


2.用java示例设计一个自动售货机

想象你有一台自动售货机,它会根据你的行为(比如投币、选择商品、取消等)做出响应。这台机器不是一次性执行所有任务,而是根据当前所处的状态(比如等待投币、正在出售等)来决定下一步做什么。这就是状态机的核心思想:

  • 状态(State): 描述系统当前的行为模式。比如自动售货机可以处于"空闲"、"接受硬币"、"出售商品"或"退币"等状态。
  • 事件(Event): 触发状态转换的动作。例如,用户投币是一个事件,选择商品也是一个事件。
  • 转换(Transition): 当特定事件发生时,从一个状态转移到另一个状态的过程。
  • 动作(Action): 在状态转换时执行的操作,比如打印消息或者实际执行某些功能。

3.java代码解析

(1)状态定义

首先定义一个枚举State来表示自动售货机的各个状态:

enum State
{

    IDLE, // 初始状态,等待操作

    ACCEPTING_COIN, // 正在接受硬币

    SELLING, // 正在出售商品

    RETURNING_COIN // 正在退币

}

 

(2)实现自动售货机类

接着,我们创建一个VendingMachine类,它包含了模拟自动售货机行为的方法:

public class VendingMachine {

    private State currentState = State.IDLE; // 初始状态设为IDLE



    // 投入硬币

    public void insertCoin() {

        // 如果当前是空闲状态,接受硬币并改变状态到"接受硬币"

        if (currentState == State.IDLE) {

            System.out.println("接受硬币...");

            currentState = State.ACCEPTING_COIN;

        } else {

            System.out.println("不能投币,机器不在空闲状态。");

        }

    }



    // 选择商品

    public void selectProduct() {

        // 只有在接受硬币状态下才能选择商品

        if (currentState == State.ACCEPTING_COIN) {

            System.out.println("选择商品,开始出售...");

            currentState = State.SELLING; // 改变状态到"出售商品"

        } else {

            System.out.println("请先投币。");

        }

    }



    // 取消购买

    public void cancel() {

        // 如果在接受硬币或出售商品状态,可以取消操作并退币

        if (currentState == State.ACCEPTING_COIN || currentState == State.SELLING) {

            System.out.println("取消购买,开始退币...");

            currentState = State.RETURNING_COIN; // 改变状态到"退币"

        } else {

            System.out.println("没有正在进行的交易可取消。");

        }

    }



    // 退币完成

    public void coinReturned() {

        // 从退币状态回到空闲状态

        if (currentState == State.RETURNING_COIN) {

            System.out.println("退币完成。");

            currentState = State.IDLE;

        } else {

            System.out.println("没有正在进行的退币操作。");

        }

    }

}

(3)测试代码

最后,我们通过main方法来测试这个简单的状态机:

public static void main(String[] args) {

    VendingMachine vm = new VendingMachine();



    vm.insertCoin(); // 用户投币

    vm.selectProduct(); // 用户选择商品

    vm.cancel(); // 用户决定取消,应该退币

    vm.coinReturned(); // 假设退币过程完成,通知机器

}