首页 > 编程语言 >在javascript中定义三个状态机

在javascript中定义三个状态机

时间:2024-05-30 22:29:07浏览次数:19  
标签:break javascript 定义 transition 状态机 event currentState log

// 定义基础状态机类
class BaseStateMachine {
    constructor(initialState) {
        this.currentState = initialState;
    }

    // 转换状态的方法,子类需要根据实际逻辑重写此方法
    transition(event) {
        throw new Error("transition method must be implemented in subclass");
    }
}

// 定义开关机状态机
class ToggleMachine extends BaseStateMachine {
    transition(event) {
        switch (this.currentState) {
            case 'off':
                if (event === 'toggle') this.currentState = 'on';
                break;
            case 'on':
                if (event === 'toggle') this.currentState = 'off';
                break;
            default:
                console.log('Invalid event for ToggleMachine');
        }
        console.log(`ToggleMachine is now ${this.currentState}`);
    }
}

// 定义门开关状态机
class DoorMachine extends BaseStateMachine {
    transition(event) {
        switch (this.currentState) {
            case 'closed':
                if (event === 'open') this.currentState = 'open';
                break;
            case 'open':
                if (event === 'close') this.currentState = 'closed';
                break;
            default:
                console.log('Invalid event for DoorMachine');
        }
        console.log(`DoorMachine is now ${this.currentState}`);
    }
}

// 定义停止与启动状态机
class StopStartMachine extends BaseStateMachine {
    transition(event) {
        switch (this.currentState) {
            case 'stopped':
                if (event === 'start') this.currentState = 'running';
                break;
            case 'running':
                if (event === 'stop') this.currentState = 'stopped';
                break;
            default:
                console.log('Invalid event for StopStartMachine');
        }
        console.log(`StopStartMachine is now ${this.currentState}`);
    }
}

// 创建状态机实例
const toggleMachine = new ToggleMachine('off');
const doorMachine = new DoorMachine('closed');
const stopStartMachine = new StopStartMachine('stopped');

// 定义状态机数组
const stateMachinesArray = [toggleMachine, doorMachine, stopStartMachine];

// 触发状态转换示例
stateMachinesArray[0].transition('toggle'); // 应输出: ToggleMachine is now on
stateMachinesArray[1].transition('open');   // 应输出: DoorMachine is now open
stateMachinesArray[2].transition('start');  // 应输出: StopStartMachine is now running

标签:break,javascript,定义,transition,状态机,event,currentState,log
From: https://blog.csdn.net/m0_60329232/article/details/139329839

相关文章

  • 【scau数据库实验一】mysql_navicat_数据库定义实验、基本命令
    实验一开始之前,如果还有不会使用navicat建议花五分钟补课哦~补课地址:【scau数据库实验先导】mysql_navicat_数据库新建、navicat的使用-CSDN博客实验目的:理解和掌握数据库DDL语言,能够熟练地使用SQL DDL语句创建、修改和删除数据库、模式和基本表。实验报告要求:实验报......
  • JavaScript实现跳转的方法
    在JavaScript中,实现页面跳转(即导航到另一个网页)有多种方法。以下是一些常见的方法及其示例代码:1.使用 window.location.href通过设置 window.location.href 属性,可以跳转到新的URL。javascriptwindow.location.href="https://www.example.com";2.使用 window.open......
  • OSPF状态机+SPF算法
      OSPF状态机1.点到点网络类型   down-->init-->(前提为可以建立邻接)exstart——>exchange-->若查看邻接的DBD目录后发现不用进行LSA直接进入ful。若查看后需要进行查询、应答先进入loading,在查询应答完后再进入fuIl:2.MA网络类型   down-->init-->2way-......
  • 说说 Javascript 数字精度丢失的问题,如何解决?
    一、场景复现一个经典的面试题0.1+0.2===0.3//false为什么是false呢?先看下面这个比喻比如一个数1÷3=0.33333333......3会一直无限循环,数学可以表示,但是计算机要存储,方便下次取出来再使用,但0.333333......这个数无限循环,再大的内存它也存不下,所以不能存储一个相......
  • JavaDS-学习数据结构之如果从零开始手搓顺序表,顺带学习自定义异常怎么用!
    前言笔者开始学习数据结构了,虽然笔者已经会用了,不管是C++中的stl亦或是Java中的集合,为了算法比赛多少都突击过,但只知其然而不知其所以然,还是会限制发展的,因此,笔者写下这篇博客.内容是手搓一个顺序表.顺带加一点异常的使用,大伙看个乐子就好了.有错误直接私信喷我就......
  • QT事件触发顺序探讨:处理自定义事件与系统事件的冲突
    1.课题背景在项目开发过程中用到了纯按键的QT交互,我们通过自定义以下全局键盘事件类进行交互的实现:classKEYPRESSFILTER_EXPORTKeyPressFilter:publicQObject{Q_OBJECTpublic:staticKeyPressFilter*instance(){if(m_instance==nullptr){......
  • C#自定义事件的写法
    C#事件基于委托例1:只用于学习,理解事件底层原理,不推荐这么写;例2:系统用的就是该方式,例如按钮的Click事件;例3:最简略的写法,但是需要客户代码转换EventArgs;1、事件声明完整格式范例: 1//自定义事件参数,默认以EventArgs结尾,需要继承EventArgs类2publicclassMyEventArgs:......
  • 【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(一)
     SpringDataJPA系列1、SpringBoot集成JPA及基本使用2、SpringDataJPACriteria查询、部分字段查询3、SpringDataJPA数据批量插入、批量更新真的用对了吗4、SpringDataJPA的一对一、LazyInitializationException异常、一对多、多对多操作5、SpringDataJPA自定......
  • TabControl和TabItem的样式自定义:为什么要使用自定义模板?
    在WPF(WindowsPresentationFoundation)中,控件的外观和行为是通过控件模板(ControlTemplate)来定义的。TabControl和TabItem控件也不例外,它们的默认控件模板定义了这些控件的结构和视觉状态。在实际应用中,开发者可能会发现直接设置TabItem的某些属性(例如Background)时不会生效。这篇......
  • 你知道列存储的定义和优势以及行存储的区别?--数据仓库基本概念
    列存储(ColumnarStorage)是一种数据库存储数据的方式,它将每一列的数据存储在一起,而不是按行存储。这与传统的行存储(RowStorage)相反,后者将一行中的所有数据存储在一起。列存储的定义:列存储数据库或文件系统会将表中的每一列数据分别存储在不同的位置。例如,如果有一个表包含......