状态模式学习笔记 --有限状态机的实现

news/2024/6/29 12:02:06 标签: action, 编译器, 敏捷, java, 测试, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

有限状态自动机的实现方式
1、使用switch/case模式࿰c;每个case表示一个状态࿰c;而在case的处理里面进行状态转换。
如:
switch(state)
{
ce:pre">case LOCKED:
ce:pre">switch(event)
ce:pre">{
ce:pre">case COIN:
ce:pre">state = UNLOCK;
ce:pre">dounlocked event...
ce:pre">break;
ce:pre">case PASS:
ce:pre">....
ce:pre">}
ce:pre">case UNLOCK:
ce:pre">....
}


这种方式࿰c;
优点:
效率比较快


缺点:
a:当状态很多的时候࿰c;维护起来非常麻烦࿰c;容易出错。
b:不容易定位错误࿰c;对于状态的理解也不清晰。
c:这段代码没有实现有限状态机和具体事件动作的隔离。




2、使用状态表实现
采用一处添加所有状态转化表࿰c;然后事件处理的时候遍历所有的表元素实现。如下:
public Turntile(TurnstileController class="tags" href="/tags/ACTION.html" title=action>action)
{
ce:pre">  turntileController  = class="tags" href="/tags/ACTION.html" title=action>action;
ce:pre">  addTranstion(LOCKED, COIN, UNLOCKED, unlock());
ce:pre">  addTranstion(LOCKED, PASS, LOCKED,   alarm());
ce:pre">  addTranstion(UNLOCKED, COIN, UNLOCKED, thankyou());
ce:pre">  addTranstion(UNLOCKED, PASS, LOCKED, lock());
}




public void event(int event)
{
ce:pre">for(int i=0; i<transition.size(); i++)
ce:pre">{
ce:pre">Transtion transtions = (Transtions)transtions.elementAt(i);
ce:pre">if (state= transtions.currentState && event==transtions.event)
ce:pre">{
ce:pre">state = transtion.newState;
ce:pre">transtion.class="tags" href="/tags/ACTION.html" title=action>action.execute();
ce:pre">}
ce:pre">}
}


优点:
1、状态机可读性比较好
2、运行时修改状态表非常方便
3、维护起来简单
4、可以实现多个状态转换表࿰c;根据需要加载不同的转换表。


缺点:
1、效率有点低࿰c;因为需要遍历所有状态
2、需要写好多小的方法来实现动作。




3、采用状态模式。
针对每一种状态࿰c;产生一个状态类࿰c;而在状态类通过动作类对象的引用进行相应动作的托管。
另外࿰c;将所有状态转换表写在一个文件中࿰c;使用状态机class="tags" href="/tags/BianYiQi.html" title=编译器>编译器将状态文件内的状态表转换成相应的class="tags" href="/tags/JAVA.html" title=java>java或者c++源代码。


优点:
1、效率快
2、状态维护方便
3、解耦了具体状态实现和状态机的代码。
缺点:
1、需要状态机编译软件。可以下载࿰c;也可以自己实现。不过应该比较复杂。
2、


具体见《class="tags" href="/tags/MinJie.html" title=敏捷>敏捷软件开发:原则、模式与实践》P426


学到class="tags" href="/tags/CeShi.html" title=测试>测试驱动开发、状态模式的应用



cle>

http://www.niftyadmin.cn/n/739473.html

相关文章

Javascript作用域的问题

Javascript作用域的问题 发布&#xff1a;dxy 字体&#xff1a;[增加 减小] 类型&#xff1a;转载在说这个话题之前&#xff0c;我想先说几句题外话&#xff1a;最近偶然碰到有朋友问我“hoisting”的问题。即在js里所有变量的声明都是置顶的&#xff0c;而赋值则是在之后发生的…

javascript对象和c++对象的区别-----坑爹的js,痛苦的语法特性,使用方法

Javascript是“基于对象”的语言&#xff0c;因为其函数就是对象&#xff0c;而不是面向对象的语言&#xff0c;因为他不支持多态等东西。作为一个从C转换到js的程序员&#xff0c;对于js的各种作用域、类的声明方式等不安情理出牌&#xff0c;我感觉很不习惯&#xff0c;很痛苦…

覆盖索引--- 一次神奇的MySQL优化 ---select * 效率查的原因

一次神奇的MySQL优化 转载自&#xff1a; http://xiaobin.net/201109/strange-sql-performance-problem/ 话说有这么一个表&#xff1a; CREATE TABLE user_group (id int(11) NOT NULL auto_increment,uid int(11) NOT NULL,group_id int(11) NOT NULL,PRIMARY KEY (id),K…

MySQL之Covering Index

2009年01月12日 星期一 下午 08:35作者&#xff1a;老王在网上随便搜搜&#xff0c;就能找到大把的关于MySQL优化的文章&#xff0c;不过里面很多都不准确&#xff0c;说个常见的&#xff1a;SELECT a FROM ... WHERE b ...一般来说&#xff0c;很多文章会告诫你类似这样的查询…

MySQL索引 使用笔记

MySQL索引 使用笔记 转载自&#xff1a; http://www.perfgeeks.com/?p460我们平常所说的索引&#xff0c;如果没有特别指明&#xff0c;都是指B树结构组织的B-Tree索引。其中聚集索引&#xff0c;次要索引&#xff0c;覆盖索引&#xff0c;复合索引&#xff0c;前缀索引&#…

人人都能做的性能优化 web前端优化

人人都能做的性能优化 web前端优化 http://www.perfgeeks.com/?p253Web优化已经越趋成熟&#xff0c;不再那么扑朔迷离。在这里&#xff0c;我们跟据一些优化实践准则应用于perfgeeks&#xff0c;并进行了记录。Pefgeeks的系统软环境是CentOS5.3 Apache2.2.3 Wordpress2.9。…

MySQL Query Profiler的使用方法

MySQL 5.0.37版本加入了MySQL Query Profiler工具。 http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html 简单的实例 mysql> set profiling1; Query OK, 0 rows affected (0.04 sec) mysql> show profiles; Empty set (0.00 sec) mysql> S…

虚拟机能ping通,不能上网检查方法

今天弄了个虚拟机&#xff0c;结果发现不能上网&#xff0c;可以ping通&#xff0c;但是浏览器打不开网页&#xff0c;网络上搜索了一下按下面方法进行检查&#xff1a; ping www.球最大的中文搜索网站.com //查看网络是否正确联通 nslookup www.球最大…