状态机的伪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

原创粉丝点击