设计模式之状态模式

本文通过分析Android frameworks中的WiFi状态机,介绍了如何运用状态模式来处理不同状态下的行为变化。文章以饮料贩卖机为例,详细阐述了状态模式的基本概念,并展示了如何定义和切换不同状态,如闲置、有钱和出货状态。同时,提到了在Android系统中,状态模式在实现如WiFiStateMachine等组件时的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看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,就是一种状态机
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值