状态机的伪Java代码实现与一点想法
来源:互联网 发布:js 键值对动态赋值 编辑:程序博客网 时间:2024/06/03 21:38
早些日子,一直在思考状态机是什么东西,在网上查了半天,多数内容讲的和编程并不相关。
不过差了一些资料后,还是学到了一点。这篇文章就记录这件事情。
状态机是把一个对象的所有状态写出来,同时实现状态变化。在不同的状态下,改变对象的状态。
其实呢,我们写的if-else其实就是一种简单的状态机。他执行的是当对象的xx处于真时,进行什么样的操作。
如果说对象复杂一些的时候,用if-else来进行判断会很吃力。我们就可以换用更好用的办法来处理对象的状态。
稍微好一点点的处理办法就是switch,不过和if-else比起来就是半斤八两。
如果说更加复杂的状态机,可以考虑用如下的思路。
定义一个接口,表示不同状态:
public interface State{ void 外界操作1(); void 外界操作2();}
然后,用不同的状态实现接口:
public class state1 implements State{ public void 外界操作1(){ 操作1; } public void 外界操作2(){ 操作2; }}
public class state2 implements State{ public void 外界操作1(){ 操作3; } public void 外界操作2(){ 操作4; }}
这样,我们就有了2种状态,那我们怎么使用这两种状态呢?我们需要有一个对象,这个对象要有状态实例。
使用状态机的实例:
public class Machine{ private State state; public Machine(){ 初始化; } public 操作5(){ this.state = new state1(); } public 操作6(){ this.state = new state2(); } //其他操作}
这样,我们就可以表示该对象不同的状态了。在Machine类中,我们调用该类的某些方法,让状态进行改变。
我可以再举个例子。
显示器有几种状态,有电与没电,有信号与没信号,开机与关机。所以,我们可以计划下写几个状态。
没电:无论有信号没信号,开机关机与否,没电就是一种状态。
有电没信号开机:
有电没信号关机:
有电有信号开机:
有电有信号关机:
对于以上的几种状态,其中有3个操作方式进行控制,一个是接上电源,一个是接上信号线,另一个是按开关。(注意,我以上用的都是动作,动作一般对应的是对象的方法。)
所以,我们就可以写出接口了。接口的3个抽象方法就是以上的三个动作。
然后我们可以定义一个显示器对象, 在对象中定义显示器自身的状态,在初始化的时候,可以指定该对象的不同状态,然后把相应的状态类赋值给显示器自身状态。
(基本上是这样,但是以上例子没有实际意义。)
其实状态机是一直在用的东西,但是如何合理的设计一种使用方式才更难。(我目前只会这个方式。)
很多时候,我们已经在使用状态机的操作方式了。
其实我研究这个的目的主要是因为有个人总是和我说,用状态机怎么怎么做。然后我就慌得一逼,经常要查一下资料。
不过查了半天发现,了解一下状态机思路就可以了。能不能用上看业务需求。
参考资料:http://blog.csdn.net/seacean2000/article/details/10528153
- 状态机的伪Java代码实现与一点想法
- JVM原子操作的实现与一点改进想法
- 关于Java的一点想法
- 关于代码生成的一点想法
- 关于代码复杂度的一点想法
- 对写代码的一点想法
- 关于代码审查的一点想法
- Python实现素数过滤的一点想法
- 关于“平衡”与“常识”的一点想法
- 关于Java数组的一点想法
- 一点想法与打算
- Stateflow 状态机是怎么代码实现的
- 一个java状态机样例的代码
- 一个java状态机样例的代码
- 玩萨尔达的一点想法
- MVC的一点想法
- svn 的一点想法
- 最近的一点想法
- React 子组件向父组件传值
- 1044: [HAOI2008]木棍分割
- Java 语法分析器LR0
- 已有常量数组n个,将它们封装成结构体
- servlet技能树
- 状态机的伪Java代码实现与一点想法
- STM32F103mini教程学习总结与心得(二)---->串口通信
- Tomcat使用总结
- poj1738 An old Stone Game 石子合并(归并) GarsiaWachs算法
- 十三、断路器-Hystrix 的隔离策略
- How to Type (字符大小写转换)
- 类型萃取
- Servlet学习
- 多态性和虚函数