160308-学习State Pattern Actor

状态机知识

  • 状态A所做的事情
  • 状态B所做的事情
  • AB转换的条件
  • BA转换的条件
  • 结束的条件
  • 在各个转换的过程中所执行的转换动作

示例程序在此处

D:\Program Files (x86)\National Instruments\LabVIEW 2014\ProjectTemplates\Source\Actor Framework

学习文档

  • Process State.lvclass inherits from State Actor.lvclass
    • context actor ,是组成所有状态的操作者的共同的祖先
    • 继承自该类的状态有:Idle.lvclass, Running.lvclass
  • Context actor 特点
    • 所有状态共享的属性
    • 重写Substitute Actor.vi,将属性从一个状态(操作者)转移到另一个状态(操作者)
    • 重写Actor Core.vi
    • 改变状态的方法(method
    • 父操作者能调用的方法,这个方法可以改变状态(?)
    • 调用这些方法的消息类
  • Change State.vi(是 State Actor 的成员)
    • 改变状态的方法(method)会调用Change State.vi
  • Process States.lvlib(状态类,继承自 context actor Process State.lvclass
    • 重写Entry.viExit.vi,这两个函数可以进出状态
    • 随着状态的改变,一些行为会发生变化,重写这些方法
    • 新建这个状态特有的一些行为
    • 调用这些行为的消息类
  • Context actor's state transition methods(定义转换动作)
    • 包括进入转换动作和退出转换动作
    • 创建方法重写 Substitute Actor.vi
    • 创建消息类
  • 当操作者在某一状态,接收到不合适的消息数据类型时会产生错误
    • 可以选择自动丢弃这一数据,且不抛出异常
    • 更改 Do.vi Method
  • 如果你想要更复杂的行为,可以把这个行为函数放置在父类中,这样子类就可以不同地重写这一函数
  • 运行过程
  • 启动系统:将一个初始状态传给Launch Actor.vi
  • 系统的调用者(Caller)发送公共状态转换消息给一个State,间接调用状态转换函数(方法);或者一个State自己直接调用转换函数
  • State Pattern UI.lvclass
    • 这是用户接口,这个操作者启动一个State Pattern Actor, Process States, as a nested actor

思考

  • 操作者们需要哪些状态?状态图怎么画?
  • 在一个状态中可不可以实现触发执行动作(已证明可以)和周期执行动作?
  • 怎样实现?

测试

  • 对父类的Go to Idle.vi和子类的 Go to Idle.vi进行断点测试,发现这两个函数并无关系,谁先执行谁后执行,取决于发消息的对象到底发送给了谁。
    • 你会发现父类和子类都有相应函数,但是消息类只有一个(?)
  • 认为可以在响应函数中加入循环,使用通知器等线程同步方法对循环进行控制
  • 每一个拥有状态机模型的对象都可以有这样一个类结构,包括:State UI 类,Process父类,若干个State
    • UI类包括界面和核心函数
    • Process父类包括核心函数(此核心函数没有循环,请注意其程序框图),和状态切换函数,此函数用于切换状态
    • State类,包括近出入状态的函数和状态停留执行函数(当前项目中这个函数为触发型),此函数应该可以改造为周期执行,不过周期执行函数也可以看做为周期触发,即在上一层(调用)函数中设置周期触发逻辑。

看教科书

  • 在软件模型设计的过程中,画出状态图,就可以依照状态图设计出操作者框架的状态模型。

边设计边编程

  • 根据当前项目的要求,画出状态图,根据状态图进行设计

猜你喜欢

转载自www.cnblogs.com/lizhensheng/p/11241986.html
今日推荐