状态模式实例

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


首页 我的博客
粤ICP备17103704号