public abstract class State
{
protected Context m_Context = null;
public State (Context theContext)
{
m_Context = theContext;
}
public abstract void Handle (int Value);
}
其中函式 State 沒有 void 卻不用使用回傳值(return),是因為它跟類別名稱相同,因此會被判斷為一個建構式,有興趣了解建構式可以參考下列文章。
public class ConcreteStateA : State
{
public ConcreteStateA(Context theContext) : Base (the Context)
{}
public overrid void Handle (int Value)
{
Debug.Log("ConcreteStateA.Handle");
if ( Value 10)
m_Context.SetState ( new ConcreteStateB(m_Context );
}
}
public class ConcreteStateB : State
{
public ConcreteStateB(Context theContext) : Base (the Context)
{}
public overrid void Handle (int Value)
{
Debug.Log("ConcreteStateB.Handle");
if ( Value 20)
m_Context.SetState ( new ConcreteStateC(m_Context );
}
} public class ConcreteStateC : State
{
public ConcreteStateC(Context theContext) : Base (the Context)
{}
public overrid void Handle (int Value)
{
Debug.Log("ConcreteStateC.Handle");
if ( Value 30)
m_Context.SetState ( new ConcreteStateA(m_Context );
}
}
為了方便測試,數值每到一個階段 ,就會切換狀態。
五、測試-狀態模式(State Diagram)
接下來,我們可以創建一個新的 Unity 程式腳本:
public class UnitTest : MonoBehaviour
{ private void Start()
UnitTest_implement(); private void UnitTest_implement() { Context context = new Context(); context.SetState(new ConcreteStateA(context)); context.Request(5); context.Request(15); context.Request(25); context.Request(35); }
}
1. 建立新的物件 / 物件實例化
在「Context context = new Context();」的過程中,我們創建了一個新的環境(Context)欄位,並且使用建構式創建一個新的環境給指派進去。