java多状态机_一个java状态机样例的代码

在UML当中有状态机视图,这个状态机可以用于自动售货机,自动售票机等等场景,下面是用java代码模拟的一个状态机:

1.状态机接口

package stateMachine;

/**

* 状态机接口

* @author seacean

* @date 2013-8-29

*/

public interface State {

/**

* 投入硬币

*/

void insertQuarter();

/**

* 根据摇动情况,处理摇动结果,返回处理结果,释放糖果

*/

void ejectQuarter();

/**

* 转动摇柄

*/

void turnCrank();

/**

* 机器放出糖果,处理机器内部状态,返回初始可投币状态

*/

void dispense();

}

2.带有状态机的机器

package stateMachine;

/**

* 机器类,包含多种状态,处理流程

* @author seacean

* @date 2013-8-29

*/

public class Machine {

//机器本身包含所有的状态机

private State soldOutState;

private State noQuarterState;

private State hasQuarterState;

private State soldState;

private State state; //机器的当前状态

private int count = 0;//机器中当前糖果的数量

/**

* 初始化机器,引入所有的状态机,初始化糖果数量,初始化机器状态

* @param count

*/

public Machine(int count) {

this.soldOutState = new SoldOutState(this);

this.noQuarterState = new NoQuarterState(this);

this.hasQuarterState = new HasQuarterState(this);

this.soldState = new SoldState(this);

this.count = count;

if (this.count > 0) {

this.state = noQuarterState;

}

}

/**

* 释放糖果时的内部处理程序

*/

public void releaseBall() {

System.out.println("a gumball comes rolling out the solt...");

if (count > 0) {

count -= 1;

}

}

public void insertQuerter() {

state.insertQuarter();//加入硬币

}

public void ejectQuarter() {

state.ejectQuarter();

}

public void turnCrank() {

state.turnCrank();

state.dispense();

}

public State getSoldOutState() {

return soldOutState;

}

public State getNoQuarterState() {

return noQuarterState;

}

public State getHasQuarterState() {

return hasQuarterState;

}

public State getSoldState() {

return soldState;

}

public State getState() {

return state;

}

public int getCount() {

return count;

}

public void setState(State state) {

this.state = state;

}

}

3.下面是状态机的一些实现类

package stateMachine;

/**

* 机器处于没有投硬币的状态

* @author seacean

* @date 2013-8-29

*/

public class NoQuarterState implements State {

private Machine machine;

public NoQuarterState(Machine machine) {

this.machine = machine;

}

@Override

public void insertQuarter() {

System.out.println("please insert a quarter!");

machine.setState(machine.getHasQuarterState());

}

@Override

public void ejectQuarter() {

System.out.println("please insert a quarter!");

}

@Override

public void turnCrank() {

System.out.println("please insert a quarter!");

}

@Override

public void dispense() {

System.out.println("please insert a quarter!");

}

}package stateMachine;

/**

* 机器处于有硬币,有糖果,没有摇动的状态

* @author seacean

* @date 2013-8-29

*/

public class HasQuarterState implements State {

private Machine machine;

public HasQuarterState(Machine machine){

this.machine=machine;

}

@Override

public void insertQuarter() {

System.out.println("You can not insert another quarter!");

}

@Override

public void ejectQuarter() {

System.out.println("Quarter returned!");

machine.setState(machine.getNoQuarterState());

}

@Override

public void turnCrank() {

System.out.println("You turned ... ");

machine.setState(machine.getSoldState());

}

@Override

public void dispense() {

System.out.println("No gumball dispensed!");

}

}

package stateMachine;

/**

* 机器正在出售糖果的状态

*

* @author seacean

* @date 2013-8-29

*/

public class SoldState implements State {

private Machine machine;

public SoldState(Machine machine) {

this.machine = machine;

}

@Override

public void insertQuarter() {

System.out.println("please wait,we are already giving you a gumball!");

}

@Override

public void ejectQuarter() {

System.out.println("Sorry, you have turned the crank!");

}

@Override

public void turnCrank() {

System.out.println("Turning twice does not get you another gumball!");

}

@Override

public void dispense() {

machine.releaseBall();

if (machine.getCount() > 0) {

machine.setState(machine.getNoQuarterState());

} else {

System.out.println("Out of Gumballs!");

machine.setState(machine.getSoldOutState());

}

}

}

package stateMachine;

/**

* 机器处于无糖果状态

* @author seacean

* @date 2013-8-29

*/

public class SoldOutState implements State {

private Machine machine;

public SoldOutState(Machine machine) {

this.machine=machine;

}

@Override

public void insertQuarter() {

System.out.println("Sorry, there is no gumball in the machine!");

}

@Override

public void ejectQuarter() {

System.out.println("Sorry, there is no gumball in sold!");

}

@Override

public void turnCrank() {

System.out.println("Sorry, there is no gumball!Turn is no meaning.");

machine.setState(machine.getNoQuarterState());

}

@Override

public void dispense() {

System.out.println("Sorry, there is no gumball!");

}

}

4.下面是测试类

package stateMachine;

//测试类

public class StateMachineTest {

public static void main(String[] args) {

Machine machine=new Machine(10);

for(int i=0;i<11;i++){

System.out.println(machine);

machine.insertQuerter();

machine.turnCrank();

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值