【Unity與23種設計模式】狀態模式(State)
定義:
“讓一個對象的行為隨著內部狀態的改變而變化,而該對象也像是換了類一樣”
應用場景:
角色AI:控制角色在不同狀態下的AI行為
服務器連接狀態:開始連線、連線中、斷線等狀態
關卡進行狀態:不同關卡
using System;
using UnityEngine;
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;
}
}
public abstract class State {
protected Context m_Context = null;
public State(Context theConText) {
m_Context = theConText;
}
public abstract void Handle(int Value);
}
//狀態A
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));
}
}
//狀態B
public class ConcreteStateB : State {
public ConcreteStateB(Context theContext) : base(theContext) { }
public override void Handle(int Value)
{
Debug.Log("ConcreteStateA.Handle");
if (Value > 20)
m_Context.SetState(new ConcreteStateC(m_Context));
}
}
//狀態C
public class ConcreteStateC : State
{
public ConcreteStateC(Context theContext) : base(theContext) { }
public override void Handle(int Value)
{
Debug.Log("ConcreteStateA.Handle");
if (Value > 30)
m_Context.SetState(new ConcreteStateA(m_Context));
}
}
Context(狀態擁有者)
一個具有狀態屬性的類,可以制定相關的接口,讓外界能夠得知狀態的改變或通過操作讓狀態改變
State(狀態接口類)
制定狀態的接口,負責規範Context在特定狀態下要表現的行為。
ConcreteState(具體狀態類)
繼承自State,實現Context在特定狀態下該有的行為。
文章整理自書籍《設計模式與遊戲完美開發》 菜升達 著
【Unity與23種設計模式】狀態模式(State)