首页 > 编程语言 >什么是状态机,用简单的java示例说明状态机的概念

什么是状态机,用简单的java示例说明状态机的概念

时间:2024-05-30 22:29:37浏览次数:18  
标签:状态 退币 java 示例 System 状态机 State println currentState

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(); // 假设退币过程完成,通知机器

}

 

 

标签:状态,退币,java,示例,System,状态机,State,println,currentState
From: https://blog.csdn.net/m0_60329232/article/details/139307387

相关文章

  • 在javascript中定义三个状态机
    //定义基础状态机类classBaseStateMachine{constructor(initialState){this.currentState=initialState;}//转换状态的方法,子类需要根据实际逻辑重写此方法transition(event){thrownewError("transitionmethodmustbeimp......
  • Java集合(一)
    集合概念:集合是JavaAPI所提供的一系列类,可以用于动态存放多个对象。集合只能存对象集合与数组的不同在于,集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型。(集合中不能放基本数据类型,但可以放基本数据类型的包装类),集合类全部支持泛型,是一种数据安全的用法。......
  • Java函数式编程
    Java函数式编程Java8引入了对函数式编程的支持。Java8中引入的主要特性1.Lambda表达式和函数式接口:Lambda表达式允许以更简洁的方式表达一个方法的实现。函数式接口,只定义了一个抽象方法的接口(使用@FunctionalInterface注解来标记此类接口),与Lambda表达式一起使用,以便可......
  • java集合框架
    java集合框架前言:本节我们来学习java集合框架1.0什么是集合集合便是对象的容器,定义了多个对象进行操作的常用方法集合和数组的区别:1数组长度固定,集合长度不固定2数组可以存储基本类型和引用类型,集合只能存储引用类型。我们在使用集合时,需要导入java.utill的所有内容1.1......
  • Java 异常处理
    超详细:Java异常处理和最佳实践(含案例分析)https://mp.weixin.qq.com/s/7MbgphfBDBHWLx9nx5lHqA1.异常处理https://blog.csdn.net/lanuage/article/details/94303169 https://www.cnblogs.com/panshenlian/p/14095564.htmlhttps://www.cnblogs.com/fulfill/p/16046859.html......
  • 简单网页爬虫(java)
    一、绪论 1.功能通过用户输入的一个网址,该程序可以不重复地打印出这个网址中涉及到的一系列其他网址信息2.预备知识1.java的基础语法2.java文本IO及异常处理二、代码实现1.代码思路创建两个数组,一个数组存取已经访问过的网址,一个数组存取准备访问地网址,大概的思想和BF......
  • JavaScript实现跳转的方法
    在JavaScript中,实现页面跳转(即导航到另一个网页)有多种方法。以下是一些常见的方法及其示例代码:1.使用 window.location.href通过设置 window.location.href 属性,可以跳转到新的URL。javascriptwindow.location.href="https://www.example.com";2.使用 window.open......
  • Java容器集合
    简单示意图详细示意图ArrayList和LinkedList区别ArrayList(默认size为10)是实现了基于动态数组的数据结构,LinkedList基于双向链表的数据结构。对于随机访问get和set,ArrayList效率优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remo......
  • java单元测试:spring测试模块
    Spring测试模块为开发者提供了一套强大的工具,用于在Spring应用中进行单元测试、集成测试和端到端测试。1.测试框架集成Spring测试模块与多个测试框架集成,最常用的是JUnit5和TestNG。JUnit5集成使用@ExtendWith(SpringExtension.class)注解来启用Spring测......
  • OSPF状态机+SPF算法
      OSPF状态机1.点到点网络类型   down-->init-->(前提为可以建立邻接)exstart——>exchange-->若查看邻接的DBD目录后发现不用进行LSA直接进入ful。若查看后需要进行查询、应答先进入loading,在查询应答完后再进入fuIl:2.MA网络类型   down-->init-->2way-......