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

}

}

}

java多状态机_一个java状态机样例的代码相关推荐

  1. 一个java源文件允许_一个Java源文件中最多只能有一个class定义

    一个Java源文件中最多只能有一个class定义 答:× 确诊甲状腺功能紊乱的常规指标是 答:FT3和FT4 I will not let my children in that way. 答:be ...

  2. java笔试题_一个Java程序员在百度的笔试题整理

    以下是程序员去百度的笔试题目整理 欢迎大家讨论,文末有福利. A 卷 Java中 ++ 操作符是线程安全的吗? a=a+b 与 a+=b的区别? 写出Java的单例模式 为什么在重写equals方法的 ...

  3. java semaphore 等待时间_一个java同步工具类Semaphore的详解

    Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了.这篇文章将对Semaphore的概念和使用进行一个详解. 一.概念理解 官方是这样 ...

  4. java项目学习_一个Java项目的学习

    1. java命令行的启动 首先是gradle build 其次是:java -Dabc.appid=1234 -classpath "a.jar:b.jar"  com.ctri ...

  5. java 文件加密_一个JAVA文件加密代码

    import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.secu ...

  6. java飞机场模拟程序_一个java程序模拟race condition的程序,用飞机进港来模拟,自己写了一部分...

    题目是这样的:按照狄更斯算法,算法都在我写的程序里面了,要求两架飞船进港,同时只能是一架飞机进港,他们之间用global参数来进行racecondition.现在我把大体的程序写了一下,我不... 题 ...

  7. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  8. (一)初识java ---我的第一个java程序

    初识java ---我的第一个java程序 课程目录 l  準備 l  開発環境的準備 l  環境変数Path設定 l  第一个程序 目标 «  实现自己的HelloWorld并运行看到结果 一.準備 ...

  9. java applet配置_配置Java Applet的运行环境

    Java小程序,也就是Java Applet,可以在Web浏览器中运行.Java Applet必须以脚本的形式嵌入到HTML页面中,才能在web浏览器中运行. 之前总以为本地安装了JDK,指定好JAV ...

最新文章

  1. Jenkins中运行脚本提示“Permission denied”,没有权限解决方法(MacOS)
  2. java窗口坐标_如何在Java中获取窗口外部的鼠标单击坐标
  3. 【python】lambda函数
  4. qt creator php扩展,用qt creator搭建开发、调试php扩展的环境
  5. 前端常用效果(3)带动画的比较型柱状图
  6. cmake构建NNIE工程
  7. 生成手写文字图片_如何把手机图片转成PDF文件?这个技巧你一定能学会!
  8. 3D Max 2016安装教程
  9. 软件编程自学快速入门
  10. 语音通计算机怎么安装方法,win7系统语音包安装图文教程
  11. 如何脱控极域电子教室
  12. 点餐小程序源码­|PHP微信点餐小程序
  13. 计算机出现蓝屏怎么恢复,电脑蓝屏怎么解决,小编教你如何恢复正常
  14. xz1刷Android10,索尼xz1国行版安卓9.0固件
  15. 《薛兆丰的经济学课》课程总结5--需要协调
  16. Mac m1 tensorflow 内核似乎挂掉了,它很快将自动重启
  17. 阿里云盘帮我扩容了10个T,拿来吧你!
  18. Canonical通过Flutter启用Linux桌面应用程序支持
  19. 深度学习 机器学习基础_实用的机器学习基础
  20. 使用loadrunner javavuser协议开发脚本实战

热门文章

  1. SVN: Can't create session svn
  2. java 析构方法_java析构方法详解
  3. python+ seleniumAPPium自动化 page Object 设计模式
  4. 星级评价组件--引发对React组件的思考
  5. 浏览器滚动的详细解释 Vue 固定滚动位置的实现
  6. php多进程pcntl学习(一)
  7. windows 7 64bit python3.3安装pyqt
  8. sql2000数据库备份文件还原到sql2005
  9. MSDN宇宙版到货!
  10. 蔬菜大棚成本_蔬菜大棚建设标准和成本