在看Android中frameworks中的wifi部分时,发现frameworks有很多的状态机
感谢朋友的分享,让我学习了java设计模式中的状态模式,很有感触。简单
总结记录一下,巩固一下。
用我们日常的饮料贩卖机为例,
简单的对其进行一下定义
人的操作有投币,选择饮料,退币三个操作。
饮料机的状态有闲置,有钱,出货三个状态
首先简单定义一下IState.java的接口。
public interface IState {
public void processMessage(int message);
}
然后定义一个State.java的类,实现接口public class State implements IState {
@Override
public void processMessage(int message) {
}
}
开始定义饮料机状态
空闲状态freeState
有钱状态hasMoneyState
出货状态GivingState
还有一些指令
CMD_ADDMONEY 投币(每次投入1块钱)
CMD_RETURNMONEY 退币
CMD_BUY 选择饮料购买
CMD_GIVINGDRINK 状态机吐饮料
处于不同状态的时候,将进行不同的操作,并且当前状态会被转换到其他状态!(transitionTo)
<pre name="code" class="java">//根据不同的状态进行切换,在不同的状态中做处理
public class DrinkMachine {
//定义剩下的钱,三种状态,以及当前状态
private int mRestMoney = 0;
private State freeState;
private State hasMoneyState;
private State givingState;
private State mCurrentState = null;
//定义一些指令,即用户的操作
static final int CMD_BASE = 0;
static final int CMD_ADDMONEY = CMD_BASE + 1;
static final int CMD_RETURNMONEY = CMD_BASE + 2;
static final int CMD_BUY = CMD_BASE + 3;
static final int CMD_GIVINGDRINK = CMD_BASE + 4;
class FreeState extends State {
@Override
public void processMessage(int message) {
switch (message) {
case CMD_ADDMONEY:
mRestMoney++;
mCurrentState = hasMoneyState;
System.out.print("第一次放入一块钱,剩下"+mRestMoney);
break;
case CMD_BUY:
System.out.print("no money to buy");
break;
case CMD_RETURNMONEY:
System.out.print("no money to return");
default:
break;
}
log();
}
}
class HasMoneyState extends State
{
@Override
public void processMessage(int message) {
switch (message) {
case CMD_RETURNMONEY:
System.out.print("退钱,退出:"+mRestMoney);
mRestMoney=0;
mCurrentState=freeState;
break;
case CMD_ADDMONEY:
mRestMoney++;
System.out.print("剩下:"+mRestMoney);
break;
case CMD_BUY:
if(mRestMoney>=2)
{
mRestMoney-=2;
mCurrentState=givingState;
System.out.print("正在吐东西,剩下:"+mRestMoney);
//发出出货命令
mCurrentState.processMessage(CMD_GIVINGDRINK);
}else
{
System.out.print("钱不够,剩下:"+mRestMoney);
}
default:
break;
}
log();
}
}
class GivingState extends State
{
@Override
public void processMessage(int message) {
switch (message) {
case CMD_GIVINGDRINK:
try {
Thread.sleep(2000);
if (mRestMoney>0) {
mCurrentState=hasMoneyState;
}else
{
mCurrentState=freeState;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
default:
break;
}
log();
}
}
public DrinkMachine()
{
freeState=new FreeState();
hasMoneyState=new HasMoneyState();
givingState=new GivingState();
//初始化
mCurrentState=freeState;
}
public void addMoney()
{
//每次加1块钱
mCurrentState.processMessage(CMD_ADDMONEY);
}
public void clickBuy()
{
mCurrentState.processMessage(CMD_BUY);
}
public void clickReturn()
{
mCurrentState.processMessage(CMD_RETURNMONEY);
}
private void log()
{
String statename="";
if(mCurrentState==null)
return;
if(mCurrentState instanceof FreeState)
{
statename="FreeState";
}else if(mCurrentState instanceof HasMoneyState)
{
statename="HasMoneyState";
}else if(mCurrentState instanceof GivingState)
{
statename="GivingState";
}
System.out.println(" 状态:"+statename);
}
}
运行测试代码
<pre name="code" class="java">public class Test {
public static void main(String[] args) {
DrinkMachine drinkMachine=new DrinkMachine();
drinkMachine.addMoney(); //第一次放入一块钱,剩下1 状态:HasMoneyState
drinkMachine.clickReturn(); //<退钱,退出:1 状态:FreeState
drinkMachine.clickBuy(); //no money to buy 状态:FreeState
drinkMachine.clickReturn(); //no money to return 状态:FreeState
drinkMachine.addMoney(); //第一次放入一块钱,剩下1 状态:HasMoneyState
drinkMachine.addMoney(); //剩下:2 状态:HasMoneyState
drinkMachine.addMoney(); //剩下:3 状态:HasMoneyState
drinkMachine.clickReturn(); //退钱,退出:3 状态:FreeState
drinkMachine.addMoney(); //第一次放入一块钱,剩下1 状态:HasMoneyState
drinkMachine.addMoney(); //剩下:2 状态:HasMoneyState
drinkMachine.addMoney(); //剩下:3 状态:HasMoneyState
drinkMachine.clickBuy(); //正在吐东西,剩下:1 状态:HasMoneyState---->仍然处于 状态:HasMoneyState
<pre name="code" class="java"> drinkMachine.clickBuy(); //钱不够,剩下:1 状态:HasMoneyState</span>
drinkMachine.clickReturn(); //退钱,退出:1 状态:FreeState
drinkMachine.clickReturn(); //no money to return 状态:FreeState}}
状态机,顾名思义,通过相同的指令,在不同状态的时候对应的操作是不同的,安卓frameworks中用到了很多的状态机的知识,如最近实习时候了解到wifiStateMachine,就是一种状态机