Java如何通过枚举实现有限状态机

网友投稿 388 2022-12-02


Java如何通过枚举实现有限状态机

首先在枚举类中 定义state 和定义的抽象方法。

public enum javaPlatformState {

// 定义state

OPEN{

@Override void exit(JavaPlatformMachine pm){super.exit(pm);}

@Override void valid(JavaPlatformMachine pm){

this.exit(pNZvcrpyXim);

if(pm.data.getValid_()){

pm.state =STEP1;

}else{

NotFound();

pm.state =OFF;

}

pm.state.entry(pm);

}

@Override

void first(JavaPlatformMachine pm) {}

@Override

void businessLine(JavaPlatformMachine pm) {}

@Override

void district(JavaPlatformMachine pm) {}

},

STEP1{

@Override void exit(JavaPlatformMachine pm){super.exit(pm);}

@Override

void valid(JavaPlatformMachine pm) {}

@Override void first(JavaPlatformMachine pm){

this.exit(pm);

if(!pm.data.getFirst_()){

pm.state =STEP2;

}else{

ReturnDimension();

pm.state =OFF;

}

pm.state.entry(pm);

}

@Override

void businessLine(JavaPlatformMachine pm) {}

@Override

void district(JavaPlatformMachine pm) {}

},

...

//状态模式 提取的接口 在常量实体类中实现抽象方法

abstract void valid(JavaPlatformMachine pm);

abstract void first(JavaPlatformMachine pm);

abstract void businessLine(JavaPlatformMachine pm);

abstract void district(JavaPlatformMachine pm);

}

在enum JavaPlatformState 中,除了状态模式 提取的接口外,添加了状态机的各种动作action实现

//状态机的各种动作action methode

void entry(JavaPlatformMachine pm){System.out.println("→"+pm.state.name());}

void exit(JavaPlatformMachine pm){System.out.println(pm.state.name()+"→ ");}

void NotFound(){System.out.println("NotFound");}

void ReturnDimension(){System.out.println("ReturnDimension");}

void PreciseAdvertising(){System.out.println("PreciseAdvertising");}

void Top9(){System.out.println("Top9");}

建立状态机实体,ContextData是封装条件的bean类,初始化状态OPEN,在状态机里定义action,调用对应state的相应的方法。

public class Contexhttp://tData {

private Boolean isValid_;//广告位是否有效

private Boolean isFirst_;//是否第一次请求

private Boolean isBusinessLine_;//是否属于业务线广告位

private Boolean district_;//是否有地域

...

}

public class JavaPlatformMachine {

ContextData data = new ContextData();

JavaPlatformState state = JavaPlatformState.OPEN;

//Action

public void valid(){state.valid(this);}

public void first(){state.first(this);}

public void businessLine(){state.businessLine(this);}

public void district(){state.district(this);}

}

测试方法,初始化状态机,设置参数,按次序调用对应的Action

JavaPlatformMachine pm = new JavaPlatformMachine();

pm.data.setValid_(true);// 广告位是否有效

pm.data.setFirst_(false);// 是否第一次请求

pm.data.setBusinessLine_(true);//是否属于业务线广告位

pm.data.setDistrict_(true);//是否有地域

pm.valid();

pm.first();

pm.businessLine();

pm.district();

输出结果:

OPEN→

→STEP1

STEP1→

→STEP2

STEP2→

→STEP3

STEP3→

Top9

→OFF


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:学习Java HashMap,看这篇就够了
下一篇:SpringBoot集成Spring Security的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~