状态抽象类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值来获取切换状态。(状态模式使用示例)