Unity实现设计模式------状态模式
状态模式最核心的设计思路就是将对象的状态抽象出一个接口,然后根据它的不同状态封装其行为,这样就可以实现状态和行为的绑定,最终实现对象和状态的有效解耦。
在实际开发中一般用到FSM有限状态机的实现,GF框架中的FSM和流程控制就是基于这个原理实现的。
1.State(状态的抽象基类)
csharp
public abstract class State
{
protected Context m_Context = null;
public State(Context theContext)
{
m_Context = theContext;
}
public abstract void Handle(int Value);
}
2.ConcreteStateA,ConcreteStateB,ConcreteStateC
状态State的子类
csharp
/// <summary>
/// 状态A
/// </summary>
public class ConcreteStateA : State
{
public ConcreteStateA(Context theContext) : base(theContext)
{ }
public override void Handle(int Value)
{
Debug.Log("ConcreteStateA.Handle");
if (Value > 10)
m_Context.SetState(new ConcreteStateB(m_Context));
}
}
/// <summary>
/// 状态B
/// </summary>
public class ConcreteStateB : State
{
public ConcreteStateB(Context theContext) : base(theContext)
{ }
public override void Handle(int Value)
{
Debug.Log("ConcreteStateB.Handle");
if (Value > 20)
m_Context.SetState(new ConcreteStateC(m_Context));
}
}
/// <summary>
/// 状态C
/// </summary>
public class ConcreteStateC : State
{
public ConcreteStateC(Context theContext) : base(theContext)
{ }
public override void Handle(int Value)
{
Debug.Log("ConcreteStateC.Handle");
if (Value > 30)
m_Context.SetState(new ConcreteStateA(m_Context));
}
}
3.Context
Context类-持有目前的状态,并将相关信息传给状态
csharp
public class Context
{
State m_State = null;
public void Request(int Value)
{
m_State.Handle(Value);
}
public void SetState(State theState)
{
Debug.Log("Context.SetState:" + theState);
m_State = theState;
}
}
4.测试代码
csharp
public class StatePatternExample5 : MonoBehaviour
{
void Start()
{
UnitTest();
}
void UnitTest()
{
Context theContext = new Context();
theContext.SetState(new ConcreteStateA(theContext));
theContext.Request(5);
theContext.Request(15);
theContext.Request(25);
theContext.Request(35);
}
}