美文网首页
01.状态和转换动作

01.状态和转换动作

作者: Pilihou | 来源:发表于2021-06-07 09:37 被阅读0次
image.png

状态机是由一组状态(states), 如:

  • solid
  • liquid
  • gas

和一套转换动作(transitions)组成的, 如:

  • melt
  • freeze
  • vaporize
  • condense
  var fsm = new StateMachine({
    init: 'solid',
    transitions: [
      { name: 'melt',     from: 'solid',  to: 'liquid' },
      { name: 'freeze',   from: 'liquid', to: 'solid'  },
      { name: 'vaporize', from: 'liquid', to: 'gas'    },
      { name: 'condense', from: 'gas',    to: 'liquid' }
    ]
  });

  fsm.state;             // 'solid'
  fsm.melt();
  fsm.state;             // 'liquid'
  fsm.vaporize();
  fsm.state;             // 'gas'

一个转换动作处理多个状态

image.png

如果多个状态转换都要用相同的转换动作,那么就把name值设置为相同的动作命名。

  { name: 'step',  from: 'A', to: 'B' },
  { name: 'step',  from: 'B', to: 'C' },
  { name: 'step',  from: 'C', to: 'D' }

如果多个from状态都要转换到相同的to状态, 如:

  { name: 'reset', from: 'B', to: 'A' },
  { name: 'reset', from: 'C', to: 'A' },
  { name: 'reset', from: 'D', to: 'A' }

可以将from状态组成数组来对其进行缩写:

  { name: 'reset', from: [ 'B', 'C', 'D' ], to: 'A' }

将以上用法合并成一个简单示例如下:

  var fsm = new StateMachine({
    init: 'A',
    transitions: [
      { name: 'step',  from: 'A',               to: 'B' },
      { name: 'step',  from: 'B',               to: 'C' },
      { name: 'step',  from: 'C',               to: 'D' },
      { name: 'reset', from: [ 'B', 'C', 'D' ], to: 'A' }
    ]
  })

此示例将创建一个具有两个转换方法的对象:

  • fsm.step()
  • fsm.reset()

reset方法总是将状态转换到A状态, 而step转换到的目标状态为当前状态对应的状态结束。

通配符转换

如何适用于从任何状态转换到目标状态?可以在from状态中使用通配符*

  var fsm = new StateMachine({
    transitions: [
      // ...
      { name: 'reset', from: '*', to: 'A' }
    ]
  });

条件转换

通过提供一个函数作为to属性,可以实现在运行时选择目标状态:

  var fsm = new StateMachine({
    init: 'A',
    transitions: [
      { name: 'step', from: '*', to: function(n) { return increaseCharacter(this.state, n || 1) } }
    ]
  });

  fsm.state;      // A
  fsm.step();
  fsm.state;      // B
  fsm.step(5);
  fsm.state;      // G

  // helper method to perform (c = c + n) on the 1st character in str
  function increaseCharacter(str, n) {
    return String.fromCharCode(str.charCodeAt(0) + n);
  }

allStates方法只有在运行到这个条件状态时才包含它们:

  fsm.state;        // A
  fsm.allStates();  // [ 'A' ]
  fsm.step();
  fsm.state;        // B
  fsm.allStates();  // [ 'A', 'B' ]
  fsm.step(5);
  fsm.state;        // G
  fsm.allStates();  // [ 'A', 'B', 'G' ]

GOTO - 任意切换状态

你可以使用条件转换,组合from使用通配符,来实现任意goto行为:

  var fsm = new StateMachine({
    init: 'A'
    transitions: [
      { name: 'step', from: 'A', to: 'B'                      },
      { name: 'step', from: 'B', to: 'C'                      },
      { name: 'step', from: 'C', to: 'D'                      },
      { name: 'goto', from: '*', to: function(s) { return s } }
    ]
  })

  fsm.state;     // 'A'
  fsm.goto('D');
  fsm.state;     // 'D'

一套完整的生命周期事件在使用时仍然适用goto。

相关文章

  • 01.状态和转换动作

    状态机是由一组状态(states), 如: solid liquid gas 和一套转换动作(transition...

  • 02.数据和方法

    除了状态[states-and-transitions.md]和转换动作[states-and-transitio...

  • 【2018-09-28】马尔科夫决策过程MDP

    【1】MDP(S【状态集】,A【动作集】,{Psa}【状态转换分布】,γ【贴现因子】,R【奖励函数】) 【过程】 ...

  • 进程的状态和转换

    进程的状态和转换 进程状态 进程状态的转换 总结:

  • 12.Spark学习(Python版本):DStream转换操作

    DStream转换操作包括无状态转换和有状态转换。 无状态转换:每个批次的处理不依赖于之前批次的数据。有状态转换:...

  • 011 Spark RDD

    一、转换和动作 1.1 Transformation 常见的5种转换为filter(func)、map(func)...

  • SCXML中状态机的基本概念

    状态机的最基本概念是state(状态),transition(转换)和event(事件)。每个状态包含若干转换,这...

  • 进程的描述与控制

    进程的定义和特征 进程的特征 进程的基本状态及转换 进程的三种基本状态 三种基本状态的转换 创建状态和终止状态 挂...

  • TCP UDP协议两个重要的网络原理

    TCP UDP协议 01. TCP协议中11种状态集转换 三次握手的过程中有哪些状态第一步:服务端 开启网络服务,...

  • 状态转换?

    室友能在宿舍整日整夜不出门,吃饭完全靠我们带。能够每天每夜看小说看电视。白天睡到十二点,晚上玩到三四点。 但是同样...

网友评论

      本文标题:01.状态和转换动作

      本文链接:https://www.haomeiwen.com/subject/ntdzsltx.html