`

使用枚举实现一个状态机

    博客分类:
  • Java
阅读更多
非常巧妙的一个使用枚举的例子.原文见这里
interface Context {
    ByteBuffer buffer();
    State state();
    void state(State state);
}
interface State {
    /**
       * @return true to keep processing, false to read more data.
     */
    boolean process(Context context);
}
enum States implements State {
    XML {
        public boolean process(Context context) {
            if (context.buffer().remaining() < 16) return false;
            // read header
            if(headerComplete)
                context.state(States.ROOT);
            return true;
        }
    }, ROOT {
        public boolean process(Context context) {
            if (context.buffer().remaining() < 8) return false;
            // read root tag
            if(rootComplete)
                context.state(States.IN_ROOT);
            return true;
        }
    }
}

public void process(Context context) {
    socket.read(context.buffer());
    while(context.state().process(context));
}
分享到:
评论

相关推荐

    Java如何通过枚举实现有限状态机

    主要介绍了Java如何通过枚举实现有限状态机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    StateMachine:squirrel-foundation实现的状态机demo

    Main:启动类,实现状态机的流程控制及状态事件动作的定义 MyCondtion:自定义条件过滤器 MyEvent:自定义事件枚举列表 MyState:自定义状态枚举列表 MyStateMachine:状态机,根据需求实现AbstractStateMachine|...

    API之网络函数---整理网络函数及功能

    EnumPrintProcessorDatatypes 枚举由一个打印处理器支持的数据类型 EnumPrintProcessors 枚举系统中可用的打印处理器 Escape 设备控制函数 FindClosePrinterChangeNotification 关闭用...

    嵌入式系统的微模块化程序设计-实用状态图C/C++实现

    对于一个状态机的运行而言,这样的节省当然微乎其微,但假如你的系统同时运行成千上万个这种状态机时,那么就有必要考虑一下这种优化了。  (2)查表法  第(1)种方法再怎么优化,也需要枚举状态和消息,...

    Abodit.StateMachine:适用于现代异步.NET应用程序的分层和复合状态机

    一种用于.NET的状态机,可轻松实现具有时序的可序列化,异步,分层状态机。 有很多.NET状态机,那么这个有什么不同? 首先,它是异步的,因此进入,退出或转换操作可以使用async await 。 其次,它是层次结构的,...

    Python中的轻量级,面向对象的有限状态机实现,具有许多扩展-Python开发

    transitions在Python中具有许多扩展的轻量级,面向对象的状态机实现。 与Python 2.7+和3.0+兼容。 Installation pip install tr​​ansitions ...或从G transitions复制存储库Python中的轻量级面向对象状态机实现,...

    在逻辑设计中选择状态机的类型

    二进制和枚举包含了许多组合反馈逻辑,以实现当前状态到下一个状态的膨‘转。由于资源利用率高,因此比较适合CPLD的逻辑设计;而One ̄Hot计数器由于始终只有一位变化,组合反馈资源少,具有的速度和较强的抗干扰性能...

    Unity3d-Finite-State-Machine:直观的Unity3d有限状态机(FSM)。 在不牺牲实用性的情况下着重于可用性的设计

    以下是一个简单的状态机,该状态机应该在任何Unity上下文中都能正常工作。 专为简单而设计 教科书状态机的实现以及其他C#状态机库的扩展趋向于复杂的配置或过多的样板。 但是,StateMachines非常有用-管理开销永远...

    EDA/PLD中的在逻辑设计中选择状态机的类型

    二进制和枚举包含了许多组合反馈逻辑,以实现当前状态到下一个状态的膨‘转。由于资源利用率高,因此比较适合CPLD的逻辑设计;而One ̄Hot计数器由于始终只有一位变化,组合反馈资源少,具有最高的速度和较强的抗干扰...

    NanoFSM:一种用于创建高度紧凑,轻巧的通用有限状态机的模式

    一种用于创建高度紧凑且轻巧的通用有限状态机的模式。 两种口味 该模式的两个示例实现已包括在内。 基本和最小。 基本实现既提供安全性又提供性能,而最小实现则以安全性和性能为代价降低了LoC。 设计 简洁是关键。 ...

    DiscreteStatePattern:一种用于创建高度紧凑且轻量的通用有限状态机的模式

    一种用于创建高度紧凑且轻巧的通用有限状态机的模式。 两种口味 该模式的两个示例实现已包括在内。 基本和最小。 基本实现既提供安全性又提供性能,而最小实现则以安全性和性能为代价降低了LoC。 设计 简洁是关键。 ...

    Labview应用技术 四则运算(课堂实训).docx

    Labview应用技术 四则运算(课堂实训).docx 学习资料 复习资料 教学资源

    Java枚举(深刻而不深沉平淡而不平庸)

    1.枚举概述 2.枚举的常用方法 3.枚举的特性 ... 5.Switch状态机,组织枚举,策略枚举 6.EnumSet和EnumMap 原创文章 56获赞 82访问量 5515 关注 私信 展开阅读全文 作者:陌路逢君 唯图一笑

    javascript文档

    ignoreCase 属性 返回一个 Boolean 值,标记正则表达式使用的 ignoreCase 标志状态 (i)。 递增运算符(++) 给变量加一。 index 属性 返回在字符串中找到的第一个成功匹配的字符位置。 indexOf 方法 返回在 ...

    超级有影响力霸气的Java面试题大全文档

    Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应...

    在 STM8微控制器 上实现的低速 USB_C语言_代码_相关文件_下载

    USB 状态机,用 C 语言编写,控制设备枚举过程,模拟端点...... 原作者(俄罗斯人)没有在 Rx 代码中正确实现位去填充。我提出了两种方法来解决这个问题: 保持 12MHz 晶振,从 USB Host 接收原始数据,然后再进行 ...

    微软JavaScript手册

    ignoreCase 属性 返回一个 Boolean 值,标记正则表达式使用的 ignoreCase 标志状态 (i)。 递增运算符(++) 给变量加一。 index 属性 返回在字符串中找到的第一个成功匹配的字符位置。 indexOf 方法 返回在 ...

    JScript 语言参考

    ignoreCase 属性 返回一个 Boolean 值,标记正则表达式使用的 ignoreCase 标志状态 (i)。 递增运算符(++) 给变量加一。 index 属性 返回在字符串中找到的第一个成功匹配的字符位置。 indexOf 方法 返回在 ...

    EFStateMachine

    通常为该状态机设置一个枚举(表示其可能的状态)和一个枚举(表示其动作)。 机器的状态确定是否允许运行某个动作。 机器的状态只能通过操作来更改。 动作处理程序返回计算机的新状态。 还可以注册在某些状态发生...

    Java开发技术大全(500个源代码).

    FileList.java 自己实现的一个文件名称枚举类 MyDataIO.java 数据输入输出示例 MyFileOutput.java 将键盘读入的文字保存到文件 MyPipedIO.java 管道流示例 MySequenceIn.java 顺序输入流示例 ObjectFileTest....

Global site tag (gtag.js) - Google Analytics