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

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

public enum JavaPlatformState {

// 定义state

OPEN{

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

@Override void valid(JavaPlatformMachine pm){

this.exit(pm);

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 ContextData {

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值