使用该设计模式的情况:如在场景中的主角甚至是敌人,有N个不同状态:走路,攻击,待机.....,游戏中,这些状态来回切换。有一个明确的状态划分的情况下,此时,是可以使用Switch...case...来整理不同的状态的切换和处理的,但处理不同状态,包括切换逻辑会比较冗杂,还有一个缺点就是不容易扩展; 这种情况下,利用状态模式是比较好的。
2,解决的问题:
3,类图
声明一个接口,以封装状态的相关行为,对这个接口来说,会有实现类(有几个状态就实现几个);
若状态间进行切换只需要在Context(对象,状态拥有者),只需要在context中的State指向对应状态即可;
4,优缺点
缺点是会有很多的状态子类。
5,示例代码
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 状态模式 /// </summary> public class StateModel:MonoBehaviour { private void Start() { Context ct = new Context(); ct.SetState(new ConcreteA(ct)); //change ct.Handle(3); ct.Handle(5); } } //状态应用者 Context public class Context { private Istate mState;// public void SetState(Istate state) { mState = state; } public void Handle(int args) { mState.Hanedle(args); } } public interface Istate { void Hanedle(int args); } public class ConcreteA : Istate { private Context mContext; public ConcreteA (Context context) { mContext = context; } public void Hanedle(int args) { Debug.Log("ConcreteA:" + args); if (args > 4) { mContext.SetState(new ConcreteB(mContext)); } } } public class ConcreteB : Istate { private Context mContext; public ConcreteB(Context context) { mContext = context; } public void Hanedle(int args) { Debug.Log("B:" + args); if (args < 4) { mContext.SetState(new ConcreteA(mContext)); } } }
控制台结果
原文:https://www.cnblogs.com/allyh/p/9396389.html