java状态机设计模式_状态机设计模式

972ce0c98ce2?utm_campaign=maleskine

初识

我第一次知道状态机,是在大学学习《数字电子技术基础》的时候。一块控制芯片有若干输入数据总线Data_in,一个CLK时钟震荡输入,还有一定数量的以高低电平组合来控制状态的输入。不同的状态,芯片会对输入的数据进行不同的处理。

再之后是读研时跟着导师做课题,用Verilog HDL写FPGA程序,仿真一些数字信号的处理算法,其中也大量使用了状态机编程。

2d95c8456e05d55885811a186c97e20b.png

FPGA

还记得有一次和导师沟通科研时,他提及说状态机的这种编程模型,在软件行业也是有所应用的。当时我还是个编程战五渣,也不知道有设计模式这个东西,只是不以为意得应承地点点头。现在想想,还是蛮佩服导师的博学多知的。

再看状态机

状态机的官方定义如下:

The intent of the STATE pattern is to distribute state-specific logic across classes that represent an object’s state.

状态模式是为了将与状态有关的逻辑分写在代表对象状态的类中

我们来通过举例理解这句话。

想象你要实现一个登陆系统,用户将通过以下几个步骤与系统交互。

连接进登陆界面。

输入用户名密码,点击登陆

登陆成功则顺利进入系统,登陆失败则断开连接。

注销登录,断开连接。

f7c377bd9a7809e3a954ca13c10dfd1b.png

登录流程图

这些步骤我们抽象成状态转移图来看会更加清晰

714bce98d4d96da7e2165b33a564a8d4.png

登录状态转移图

更一般的,我们稍微增加些健壮性的操作。

3703c0db0b3f90be07260586cdf96c98.png

登录状态转移健壮性增强

这样简单的逻辑,我们可以不假思索得很快的在一份代码中完成。只要使用switch语法,对对象当前的状态做判断,然后在给各个分支中写上各自的逻辑。但是,如果你需要增加一个中间状态,或者修改某一个分支的逻辑时,你将不得不修改这个类的代码,增加case分支,修改逻辑。这违反了软件设计中的“开放封闭原则”。为此,我们将状态模式的概念付诸实施,将与指定状态有关的逻辑操作分别写在对应的可代表状态的类里。

状态机模式

316ecdb030a79e604ad632cba381b12e.png

UML视图

首先定义一个接口IState,指定所有的动作(Action)

/**

* the interface of state, input parameter is target state machine,

* and return the next state

* @author simple

* 2017年11月6日 上午10:29:58

*/

public interface IState {

public IState connect(Context context);

public IState beginToLogin(Context context);

public IState loginFailure(Context context);

public IState loginSuccess(Context context);

public IState logout(Context context);

}

定义一个抽象类,封装一些公共方法和实例成员

public abstract class AbstractState implements IState{

private StateEnum stateEnum;

public AbstractState(StateEnum stateEnum)

{

this.stateEnum = stateEnum;

}

public StateEnum getStateEnum() {

return stateEnum;

}

public void setStateEnum(StateEnum stateEnum) {

this.stateEnum = stateEnum;

}

public String toString()

{

return(stateEnum.toString());

}

}

StateEnum是一个枚举类,用来限定状态的类型。通过在构造器中传入一个枚举,来指明这个类代表什么状态。

public enum StateEnum {

UNCONNECTED(0, "UNCONNECTED"),

CONNECTED(1, "CONNECTED"),

LOGINING(2, "LOGINING"),

LOGIN_INTO_SYSTEM(3, "LOGIN_INTO_SYSTEM");

private int key;

private String stateStr;

StateEnum(int key, String stateStr)

{

this.key = key;

this.stateStr = stateStr;

}

void printState()

{

System.out.println(String.format("current state: %d: %s", this.key, this.stateStr));

}

}

通过继承AbstractState来定义IState的多个实现类,表示不同的状态。所有状态都需

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java状态机设计模式是一种用于实现状态机的软件设计模式状态机是一种抽象的模型,它描述了一个对象或者系统在不同的状态之间的转换。状态机通常包含状态、转移和事件。在Java中,可以使用状态机设计模式来实现各种不同的状态机,如有限状态自动机(FSM)和层次状态机(HSM)等。 在Java中,状态机设计模式通常使用状态模式和策略模式实现。状态模式用于描述状态转换的过程,而策略模式用于确定状态机的行为。在状态模式中,每个状态都是一个对象,而状态转换则是通过调用状态对象的方法来实现的。在策略模式中,状态机的行为是由一组策略对象来实现的,每个策略对象负责处理一种状态。 下面是一个简单的Java状态机设计模式的示例代码: ```java // 状态接口 interface State { void handle(); } // 具体状态 class ConcreteStateA implements State { public void handle() { System.out.println("State A"); } } class ConcreteStateB implements State { public void handle() { System.out.println("State B"); } } // 状态机 class Context { private State state; public Context(State state) { this.state = state; } public void setState(State state) { this.state = state; } public void request() { state.handle(); } } // 测试代码 public class Test { public static void main(String[] args) { State stateA = new ConcreteStateA(); State stateB = new ConcreteStateB(); Context context = new Context(stateA); context.request(); context.setState(stateB); context.request(); } } ``` 在这个例子中,我们定义了一个状态接口和两个具体状态(ConcreteStateA和ConcreteStateB)。我们还定义了一个状态机(Context),它包含一个状态对象,并且可以通过调用setState方法来更改状态。最后,我们在测试代码中创建了一个状态机对象,并且依次调用了两种不同状态的handle方法。 这就是Java状态机设计模式的基本实现方式。通过这种模式,我们可以更加灵活地管理对象或系统在不同状态之间的转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值