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();
}
}
}
java多状态机_一个java状态机样例的代码相关推荐
- 一个java源文件允许_一个Java源文件中最多只能有一个class定义
一个Java源文件中最多只能有一个class定义 答:× 确诊甲状腺功能紊乱的常规指标是 答:FT3和FT4 I will not let my children in that way. 答:be ...
- java笔试题_一个Java程序员在百度的笔试题整理
以下是程序员去百度的笔试题目整理 欢迎大家讨论,文末有福利. A 卷 Java中 ++ 操作符是线程安全的吗? a=a+b 与 a+=b的区别? 写出Java的单例模式 为什么在重写equals方法的 ...
- java semaphore 等待时间_一个java同步工具类Semaphore的详解
Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了.这篇文章将对Semaphore的概念和使用进行一个详解. 一.概念理解 官方是这样 ...
- java项目学习_一个Java项目的学习
1. java命令行的启动 首先是gradle build 其次是:java -Dabc.appid=1234 -classpath "a.jar:b.jar" com.ctri ...
- java 文件加密_一个JAVA文件加密代码
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.secu ...
- java飞机场模拟程序_一个java程序模拟race condition的程序,用飞机进港来模拟,自己写了一部分...
题目是这样的:按照狄更斯算法,算法都在我写的程序里面了,要求两架飞船进港,同时只能是一架飞机进港,他们之间用global参数来进行racecondition.现在我把大体的程序写了一下,我不... 题 ...
- java核心教程_核心Java教程
java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...
- (一)初识java ---我的第一个java程序
初识java ---我的第一个java程序 课程目录 l 準備 l 開発環境的準備 l 環境変数Path設定 l 第一个程序 目标 « 实现自己的HelloWorld并运行看到结果 一.準備 ...
- java applet配置_配置Java Applet的运行环境
Java小程序,也就是Java Applet,可以在Web浏览器中运行.Java Applet必须以脚本的形式嵌入到HTML页面中,才能在web浏览器中运行. 之前总以为本地安装了JDK,指定好JAV ...
最新文章
- Jenkins中运行脚本提示“Permission denied”,没有权限解决方法(MacOS)
- java窗口坐标_如何在Java中获取窗口外部的鼠标单击坐标
- 【python】lambda函数
- qt creator php扩展,用qt creator搭建开发、调试php扩展的环境
- 前端常用效果(3)带动画的比较型柱状图
- cmake构建NNIE工程
- 生成手写文字图片_如何把手机图片转成PDF文件?这个技巧你一定能学会!
- 3D Max 2016安装教程
- 软件编程自学快速入门
- 语音通计算机怎么安装方法,win7系统语音包安装图文教程
- 如何脱控极域电子教室
- 点餐小程序源码|PHP微信点餐小程序
- 计算机出现蓝屏怎么恢复,电脑蓝屏怎么解决,小编教你如何恢复正常
- xz1刷Android10,索尼xz1国行版安卓9.0固件
- 《薛兆丰的经济学课》课程总结5--需要协调
- Mac m1 tensorflow 内核似乎挂掉了,它很快将自动重启
- 阿里云盘帮我扩容了10个T,拿来吧你!
- Canonical通过Flutter启用Linux桌面应用程序支持
- 深度学习 机器学习基础_实用的机器学习基础
- 使用loadrunner javavuser协议开发脚本实战