Java版状态机

结构
StateMachine.java 
Transation.java  
    四个元素:当前状态, 目标状态, 事件, 行为 
Action.java
TestMachine.java

StateMachine.java

package com.guo.state;

import java.util.ArrayList;

public class StateMachine {

        //状态
    public enum STATE{
        IDEL,
        RUN,
        STOP
    }

    //事件
    public enum EVENT{
        RUN,
        STOP,
        OVER
    }

    public STATE currentState = STATE.IDEL;
    public ArrayList<Transation> trans;

    //注册
    public void regist(ArrayList<Transation> trans){
        this.trans = trans;
    }

    //更新
    @SuppressWarnings("unchecked")
    public <T> void change(EVENT event,T t){
        for(Transation tran : trans){
            if(tran.fromState == currentState && tran.event == event){
                if(t!=null) tran.action.beforeExec(t);
                tran.action.exec();
                currentState = tran.toState;
            }
        }
    }

}


Action.java

package com.guo.state;

public interface Action<T> {
    void beforeExec(T t);
    void exec();
}

class ActionRun<T> implements Action<T>{

    @Override
    public void exec() {
        System.out.println("ActionRun: exec");
    }

    @Override
    public void beforeExec(T t) {

    }

}


class ActionStop<T> implements Action<T>{

    @Override
    public void exec() {
        System.out.println("ActionStop: exec");
    }

    @Override
    public void beforeExec(T t) {

    }

}

class ActionOver<T> implements Action<T>{

    @Override
    public void exec() {
        System.out.println("ActionOver: exec");
    }

    @Override
    public void beforeExec(T t) {

    }

}

Transation.java


package com.guo.state;

import com.guo.state.StateMachine.EVENT;
import com.guo.state.StateMachine.STATE;

public class Transation {
    public STATE fromState;
    public STATE toState;
    public EVENT event;
    public Action action;

    public Transation(STATE fromState, STATE toState, EVENT event,Action action){
        this.fromState = fromState;
        this.toState = toState;
        this.event = event;
        this.action = action;   
    }
}

测试类 TestMachine.java


package com.guo.state;

import java.util.ArrayList;

import com.guo.state.StateMachine.EVENT;
import com.guo.state.StateMachine.STATE;

public class TestMachine {
    public static void main(String[] args) {

        ArrayList<Transation> list = new ArrayList<Transation>();

        //IDEL => RUN
        list.add(new Transation(STATE.IDEL, STATE.RUN, EVENT.RUN, new ActionRun<String>() {
            @Override
            public void exec() {
                super.exec();

            }

            @Override
            public void beforeExec(String t) {
                super.beforeExec(t);
                System.out.println(t);

            }
        }));

        //RUN => STOP
        list.add(new Transation(STATE.RUN, STATE.STOP, EVENT.STOP, new ActionStop<Integer>() {

            @Override
            public void exec() {
                super.exec();
            }

            @Override
            public void beforeExec(Integer t) {
                super.beforeExec(t);
                System.out.println(t);
            }

        }));

        //STOP => IDEL
        list.add(new Transation(STATE.STOP, STATE.IDEL, EVENT.OVER, new ActionOver<Boolean>() {

            @Override
            public void exec() {
                super.exec();
            }

            @Override
            public void beforeExec(Boolean t) {
                super.beforeExec(t);
                System.out.println(t);
            }

        }));
        StateMachine machine = new StateMachine();
        machine.regist(list);

        machine.change(EVENT.RUN, "run");
        machine.change(EVENT.STOP, 1);
        machine.change(EVENT.OVER, true);

    }
}

#### 待完善
action中有可能是异步任务or同步任务,把任务包装成js中Promise的形式,就可以兼容两种情况.<参考Rxjava>

然而并没有用在实际项目中.

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值