一个简单的状态机总结

工作中一个简单的状态机实现,总结如下。

定义状态:

public enum Qstate{
		ORDER(1),  
		CANCEL(2); 
		
		private int code;
		
		private Qstate(int code){
			this.code = code;
		}
		public int getCode(){
			return code;
		}
	}
	
	public enum Vstate{
		INIT(1),  
		ORDER(2), 
		CHECKSTOCK(3), 
		CANCEL_VENDOR(4), 
		CANCEL_USER(5), 
		OVER(6), 
		STARTSERVICE(7);
		private int code;
		private Vstate(int code){
			this.code = code;
		}
		public int getCode(){
			return code;
		}
	}

public enum State{
		ORDER_INIT(Qstate.ORDER, Vstate.INIT), 
		ORDER_ORDER(Qstate.ORDER, Vstate.ORDER), 
		ORDER_CHECKSTOCK(Qstate.ORDER, Vstate.CHECKSTOCK), 
		ORDER_STARTSERVICE(Qstate.ORDER, Vstate.STARTSERVICE), 
		ORDER_OVER(Qstate.ORDER, Vstate.OVER),  
		ORDER_VENDORCANCEL(Qstate.ORDER, Vstate.CANCEL_VENDOR), 
		CANCEL_ORDER(Qstate.CANCEL, Vstate.ORDER), 
		CANCEL_CHECKSTOCK(Qstate.CANCEL, Vstate.CHECKSTOCK), 
		CANCEL_USERCANCEL(Qstate.CANCEL, Vstate.CANCEL_USER); 
		
		private Qstate q;
		private Vstate v;
		
		private State(Qstate q, Vstate v){
			this.q = q;
			this.v = v;
		}
		public int getCode(){
			return (q.code * 100) + v.code;
		}
		public int getQCode() {
			return q.code;
		}
		public int getVCode() {
			return v.code;
		}
	}

 定义事件:

public enum Event{
		VORDER, 
		VORDER_AUTOCHECKHAVE,
		VORDER_AUTOCHECKNO,
		TIMEOUT_NOPAY,
		TIMEOUT_NOCHECKSTOCK,
		USER_CANCEL_ORDER, 
		V_CANCEL_ORDER, 
		CHECKSTOCK_HAVE,
		CHECKSTOCK_NO,
		APPLY_PAY,
		GET_CAR, 
		KEEP_ORDER,
		NOSHOW,
		RETURN_CAR; 
	}

 定义返回值:

public enum StateChgCode{
		OK_STATE_CHG, //状态流转
		OK_STATE_NO_CHG, //状态不流转
		ERROR; //状态错误不能流转
}

public class StateChgRet{
		private StateChgCode code;
		private State newState;
		
		public StateChgRet(StateChgCode code, State newState){
			this.code = code;
			this.newState = newState;
		}

		public StateChgCode getCode(){
			return code;
		}

		public State getNewState() {
			return newState;
		}
		
		@Override
		public String toString(){
			return String.valueOf(code) + "---" + String.valueOf(newState) + "---" + newState.getCode();
		}
	}

 获取当前状态:

public State getState(int qState, int vState){
			if (1 == qState){
				switch (vState){
				case 1:
					return State.ORDER_INIT;
				case 2:
					return State.ORDER_ORDER;
				case 3:
					return State.ORDER_CHECKSTOCK;
				case 4:
					return State.ORDER_VENDORCANCEL;
				case 6:
					return State.ORDER_OVER;
				case 7:
					return State.ORDER_STARTSERVICE;
				case 5:
					default:
						throw new IllegalStateException("invalid vState:" + vState);
				}
			}else if (2 == qState){
				switch (vState){
				case 2:
					return State.CANCEL_ORDER;
				case 3:
					return State.CANCEL_CHECKSTOCK;
				case 5:
					return State.CANCEL_USERCANCEL;
				case 1:
				case 4:
				case 6:
				case 7:
					default:
						throw new IllegalStateException("invalid vState:" + vState);
				}
			}
		throw new IllegalStateException("invalid qState:" + qState);
	}

 状态变更(当前状态+事件):

public StateChgRet stateChg(State curState, Event event){
			if (null != curState && null != event){
				StateChgRet ret = null;
				switch(event){
				case VORDER:
					ret = onVorder(curState);
					break;
				case TIMEOUT_NOPAY:
					ret = onTimeOutNoPay(curState);
					break;
				case TIMEOUT_NOCHECKSTOCK:
					ret = onTimeOutNoCheckStock(curState);
					break;
				case USER_CANCEL_ORDER:
					ret = onUserCancelOrder(curState);
					break;
				case V_CANCEL_ORDER:
					ret = onVendorCancelOrder(curState);
					break;
				case CHECKSTOCK_HAVE:
					ret = onCheckStockHave(curState);
					break;
				case CHECKSTOCK_NO:
					ret = onCheckStockNo(curState);
					break;
				case APPLY_PAY:
					ret = onApplyPay(curState);
					break;
				case KEEP_ORDER:
					ret = onKeepOrder(curState);
					break;
				//...太长省略一部分
					default:
						throw new IllegalStateException("Illegal state:" + curState);
				}
				return ret;
			}
			throw new IllegalStateException("param error!");
	}

 触发操作方法,返回流转后的状态:

private StateChgRet onVorder(State curState){
		switch(curState){
		case ORDER_INIT:
			return baseMgr.new StateChgRet(StateChgCode.OK_STATE_CHG, State.ORDER_ORDER); //状态可流转,流转到State.ORDER_ORDER状态
		case ORDER_ORDER:
		case ORDER_CHECKSTOCK:
		case ORDER_STARTSERVICE:
		case ORDER_OVER:
		case CANCEL_ORDER:
		case CANCEL_CHECKSTOCK:
		case ORDER_VENDORCANCEL:
		case CANCEL_USERCANCEL://状态不流转
			return baseMgr.new StateChgRet(StateChgCode.ERROR, null);
			default:
				throw new IllegalStateException("Illegal state:" + curState);
		}
}
//...

操作方法不一一列出,其它方法与onVendor()方法类似。

这个状态机通过当前状态currentState及对应的事件Event,获取状态返回值StateChgRet,StateChgRet类中包含了状态是否可以流转,以及流转后的状态是什么。

但本状态机与设计模式中的状态模式其实关系不大,因为只是通过switch-case语句进行判断而已(与if-else其实一样)。

设计模式中的状态模式定义:把不同状态的操作分散到不同的状态对象中去完成。

见我的另一篇blog:设计模式回顾之七:状态模式(State)

 

<think>好的,用户想了解如何在Android Java中实现一个状态机。我需要先回忆状态机的基本概念和常见实现方式。状态机通常由状态、事件、转换和动作组成。在Android开发中,状态机可以用于管理应用的不同状态,比如页面加载、网络请求等。 首先,我应该考虑用户可能的场景。他们可能是在开发一个需要处理多个状态的应用,比如订单状态、播放器控制或者游戏中的角色状态。这时候,一个清晰的状态能够帮助管理复杂的逻辑,避免代码混乱。 接下来,我需要确定使用哪种设计模式。状态模式是常见的选择,每个状态封装成类,实现状态特定的行为。这样符合开闭原则,容易扩展。另一种可能是使用枚举来表示状态,通过switch-case处理转换,但这种方式在状态复杂时难以维护。 然后,我应该给出具体的实现步骤。首先定义状态接口,包含各个事件的处理方法。然后为每个具体状态实现该接口。状态上下文类持有当前状态,并委托事件处理给当前状态。还需要处理状态转换的逻辑,可能需要在上下文类中设置状态的方法。 可能用户会关心如何触发状态转换,比如事件发生时如何切换状态。需要说明在具体状态类中,处理事件后调用上下文的方法来改变状态。还要考虑线程安全,特别是在Android中,UI操作需要在主线程执行。 另外,是否需要考虑与Android组件(如Activity、Service)的生命周期整合?可能需要提醒用户注意状态机的生命周期管理,避免内存泄漏。比如在Activity的onDestroy中释放资源。 还要举例说明,比如实现一个下载状态机,包含空闲、下载中、暂停、完成等状态。这样用户更容易理解。代码示例应该简单明了,展示状态模式的结构,包括接口、具体状态类、上下文类以及使用方法。 最后,是否需要提到其他实现方式,比如第三方库或Android自带的StateMachine类?可能用户不知道Android framework里有StateMachine,可以简要提及,但主要展示手写实现,因为更基础,有助于理解原理。 总结步骤:定义状态接口,实现具体状态类,创建上下文管理状态和转换,处理事件触发状态变化,确保线程安全,结合Android生命周期。提供代码示例,并讨论优缺点和适用场景。</think>在Android开发中,实现一个状态机可以帮助管理复杂的状态流转逻辑。以下是分步实现方案: 1. **定义状态接口** ```java public interface State { void handleEventA(StateContext context); void handleEventB(StateContext context); void enter(); void exit(); } ``` 2. **创建具体状态类** ```java // 空闲状态 public class IdleState implements State { @Override public void handleEventA(StateContext context) { context.setState(new WorkingState()); } @Override public void handleEventB(StateContext context) { // 无响应 } @Override public void enter() { Log.d("StateMachine", "进入空闲状态"); } @Override public void exit() { Log.d("StateMachine", "离开空闲状态"); } } // 工作状态 public class WorkingState implements State { @Override public void handleEventA(StateContext context) { // 保持当前状态 } @Override public void handleEventB(StateContext context) { context.setState(new IdleState()); } @Override public void enter() { Log.d("StateMachine", "进入工作状态"); } @Override public void exit() { Log.d("StateMachine", "离开工作状态"); } } ``` 3. **创建状态上下文类** ```java public class StateContext { private State currentState; public StateContext() { setState(new IdleState()); } public void setState(State newState) { if (currentState != null) { currentState.exit(); } currentState = newState; currentState.enter(); } public void handleEventA() { currentState.handleEventA(this); } public void handleEventB() { currentState.handleEventB(this); } } ``` 4. **在Android组件中使用** ```java public class MainActivity extends AppCompatActivity { private StateContext stateMachine; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); stateMachine = new StateContext(); Button btnA = findViewById(R.id.btn_eventA); btnA.setOnClickListener(v -> stateMachine.handleEventA()); Button btnB = findViewById(R.id.btn_eventB); btnB.setOnClickListener(v -> stateMachine.handleEventB()); } } ``` **实现要点分析:** 1. **状态隔离** 每个状态类封装自身行为,符合单一职责原则 2. **状态转换控制** - 通过`setState()`方法集中管理状态切换 - 在状态改变时自动执行`exit()`和`enter()`方法 3. **事件处理** - 对外暴露统一的事件处理接口 - 具体状态决定如何响应事件 4. **Android适配注意事项** - UI操作需通过`runOnUiThread()` - 避免在状态类中持有Activity引用 - 考虑生命周期管理(如配置变更时保存状态) **扩展优化建议:** 1. **状态持久化** ```java public void saveState(Bundle outState) { outState.putString("CURRENT_STATE", currentState.getClass().getName()); } public void restoreState(Bundle savedInstanceState) { String stateName = savedInstanceState.getString("CURRENT_STATE"); if (stateName != null) { try { Class<?> stateClass = Class.forName(stateName); setState((State) stateClass.newInstance()); } catch (Exception e) { // 异常处理 } } } ``` 2. **线程安全改进** ```java public synchronized void setState(State newState) { // 添加同步锁保证线程安全 } ``` 3. **可视化调试** 可添加状态变更监听接口: ```java public interface StateChangeListener { void onStateChanged(State oldState, State newState); } ``` **典型应用场景:** - 网络请求状态管理 - 媒体播放器控制(播放/暂停/停止) - 订单状态流转 - 游戏角色状态切换 使用状态机模式可以有效解耦业务逻辑,使代码更易维护和扩展。建议根据具体业务需求调整状态转换逻辑,必要时可结合Android的`StateMachine`类(`android.util.StateMachine`)实现更复杂的状态管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值