文档章节

一个java状态机样例的代码

明舞
 明舞
发布于 2015/07/02 10:22
字数 752
阅读 71
收藏 0

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




版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
明舞
粉丝 227
博文 424
码字总数 516555
作品 0
程序员
私信 提问
JavaOne 2016——观众得以一睹 JShell 的威力

在JavaOne 2016的主题演讲中,Java平台组的首席架构师Mark Reinhold指出Java 9并不仅仅是Jigsaw,针对Java 9,一共包含了85个JEP。我在这里会关注一个他所强调的Java新特性,JEP 222,那就是...

局长
2016/09/29
4.4K
13
JAXB 应用指南

文章转自:http://blog.csdn.net/darxin/article/details/4845820 JAXB(Java Architecture for XML Binding)是一种特殊的序列化/反序列化工具。它可以使XML数据以Java Objects的形式直接应...

红薯
2011/08/06
4.7K
0
ios界面自动化工具--Appium

ios界面自动化工具--Appium Appium是一款开源的移动端自动化测试框架,支持Android和Ios,之前简单介绍过Appium,链接http://www.yeetrack.com/?p=639。最近在做ios的自动化测试,再详细记录一...

youthflies
2014/10/29
0
0
最新的 DB2 Universal JDBC 驱动程序中的新增 JVM exit 属性

简介: 通过使用 DB2® Universal JDBC Driver 中新曾全局属性,现在您可以在使用完 SQLJ 工具(比如 db2sqljcustomize 和 db2sqljbind)时捕获 JVM exit 或 System.exit()。本文将介绍 JDBC...

IBMdW
2011/08/29
464
0
基于 JVMTI 实现 Java 线程的监控

随着多核 CPU 的日益普及,越来越多的 Java 应用程序使用多线程并行计算来充分发挥整个系统的性能。多线程的使用也给应用程序开发人员带来了巨大的挑战,不正确地使用多线程可能造成线程死锁...

红薯
2009/12/15
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
34分钟前
1
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
2
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
1
0
cocoapods 用法

cocoapods install pod install 更新本地已经install的仓库 更新所有的仓库 pod update --verbose --no-repo-update 更新制定的仓库 pod update ** --verbose --no-repo-update...

HOrange
今天
3
0
linux下socket编程实现一个服务器连接多个客户端

使用socekt通信一般步骤 1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。 2)客户端:socker()建立套接字,连接(connect)服务器,连接上后...

shzwork
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部