博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个java状态机样例的代码
阅读量:4042 次
发布时间:2019-05-24

本文共 4830 字,大约阅读时间需要 16 分钟。

      在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();         }	}}

转载地址:http://jqpdi.baihongyu.com/

你可能感兴趣的文章
python AES加密解密,key的长度不受限制
查看>>
oracle 查询sequnce# 在哪个归档备份集下面
查看>>
使用kettle 增量同步mysql到oracle以及oracle到mysql的测试
查看>>
MySQL8.0与MySQL5.7 OLTP 性能测试对比
查看>>
mongodb 分片集群安装搭建测试
查看>>
mycat 连接mongodb
查看>>
rsync 拉取备份文件(支持断点续传)
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
Oracle 12c 开启审计 埋下的坑ORA-00205 ORA-15040
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>
dump 迁移oracle db
查看>>
Oracle LogMiner详细讲解
查看>>
迁移baseline
查看>>