状态抽象类IState
namespace StateNameSpace { public abstract class IState { public StateContext mContext; public IState(StateContext context) { mContext = context; } public abstract void Handle(object data); } }
环境类Context
using System; namespace StateNameSpace { public class StateContext { private IState currentState; private Dictionary<string, IState> stateDic = new Dictionary<string, IState>(); public StateContext(TextAsset textAsset,string defaultState) { //解析配置,初始化状态 string txt = textAsset.text; string[] lines = txt.Split('\n'); Assembly assembly = Assembly.Load("Assembly-CSharp"); object[] par = new object[1]; par[0] = this; foreach (string str in lines) { string[] keyVal = str.Split(','); try { //获取实例,CreateInstance表示使用构造方法,par是参数,其他未知 IState state = (IState)assembly.CreateInstance("StateNameSpace." + keyVal[1].Trim(), false, System.Reflection.BindingFlags.CreateInstance, null, par, null, null); if (state == null) { throw new Exception("你的类名可能写错啦"); } this.RegistState(keyVal[0], state); } catch (Exception e) { Debug.LogError(e.Message); } } //设置默认状态 SetState(defaultState); } public void Handle(object data) { if (currentState != null) { currentState.Handle(data); } } public void SetState(string key) { if (!isExistState(key)) return; IState state; stateDic.TryGetValue(key,out state); currentState = state; } public void RegistState(string key,IState state) { if (isExistState(key)) return; stateDic.Add(key, state); } public void RemoveState(string key) { if (!isExistState(key)) return; } public bool isExistState(string key) { IState state; stateDic.TryGetValue(key, out state); if (state == null) { return false; } return true; } } }
创建环境类,需要提供一个配置文件,告诉key对应的状态类,自动初始化和实例化具体的状态类(利用反射),保存在字典中,根据key值来获取切换状态。(状态模式使用示例)