一个java状态机样例的代码
来源:互联网 发布:网络制作软件扑克 编辑:程序博客网 时间:2024/06/04 18:09
闭
在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;}@Overridepublic void insertQuarter() {System.out.println("please insert a quarter!");machine.setState(machine.getHasQuarterState());}@Overridepublic void ejectQuarter() {System.out.println("please insert a quarter!");}@Overridepublic void turnCrank() {System.out.println("please insert a quarter!");}@Overridepublic 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; }@Overridepublic void insertQuarter() {System.out.println("You can not insert another quarter!");}@Overridepublic void ejectQuarter() {System.out.println("Quarter returned!");machine.setState(machine.getNoQuarterState());}@Overridepublic void turnCrank() {System.out.println("You turned ... "); machine.setState(machine.getSoldState());}@Overridepublic 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;}@Overridepublic void insertQuarter() {System.out.println("please wait,we are already giving you a gumball!");}@Overridepublic void ejectQuarter() {System.out.println("Sorry, you have turned the crank!");}@Overridepublic void turnCrank() {System.out.println("Turning twice does not get you another gumball!");}@Overridepublic 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;}@Overridepublic void insertQuarter() {System.out.println("Sorry, there is no gumball in the machine!");}@Overridepublic void ejectQuarter() {System.out.println("Sorry, there is no gumball in sold!");}@Overridepublic void turnCrank() {System.out.println("Sorry, there is no gumball!Turn is no meaning.");machine.setState(machine.getNoQuarterState());}@Overridepublic 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
- 一个java状态机样例的代码
- 一个java状态机样例的代码
- 一个自动将状态机生成代码的软件
- 状态机学习及对一段 java 代码的改写
- 状态机的伪Java代码实现与一点想法
- 作为一个状态机的OpenGL
- 发一个用状态机实现的按键检测是VERILOG代码
- Java秘术:用枚举构建一个状态机
- Stateflow 状态机是怎么代码实现的
- Qt状态机框架的一个典型应用
- 一个多态性的游戏状态机系统
- 一个串口接收数据的状态机
- [Unity基础]一个简单的状态机
- 看懂了一个组合状态机的初始化
- 一个多态性的游戏状态机系统
- Java状态机
- JAVA 状态机
- 超清晰的java线程状态机图
- es6 Babel
- [Pytorch]: 错误汇总
- 离散化模板(适用于有重复元素的)
- 深入理解c++纯虚函数
- 【Eternallyc】NEFU-119-组合素数
- 一个java状态机样例的代码
- 没有id没有name iframe中获取iframe本身dom元素
- Ubuntu下 嵌入式Qt开发环境的搭建
- 二进制中1的个数及其拓展
- StudyAI上MatConvNet框架课程学习笔记1:CPU编译入门
- C# GMT格式的字符串转时间
- lvs1
- 操作Access
- js类中的公有变量和私有变量