狀態(tài)模式(State)
公司目前項(xiàng)目做一款掛機(jī)卡牌游戲,核心戰(zhàn)斗中角色的管理娜庇,場景的管理塔次,都用到了狀態(tài)模式方篮。
狀態(tài)模式是設(shè)計(jì)模式中,游戲開發(fā)最常用也是最重要的模式励负。
狀態(tài)模式有三要素:
Context:擁有狀態(tài)的類藕溅。
State:狀態(tài)模式的基類。
ConcreteState:具體狀態(tài)熄守。
舉個例子:一個手機(jī)的網(wǎng)絡(luò)狀態(tài)蜈垮,
Context:手機(jī)的網(wǎng)絡(luò)
State: 未連接耗跛,連接中 裕照,已連接。
ConcreteState:State 對應(yīng)的圖標(biāo)调塌。
狀態(tài)過度:未連接 ---> 連接中 ---> 已連接晋南。(因?yàn)榫退闶枪馑僖残枰獣r間)
可以是枚舉,懶得寫了羔砾, 1 负间,2,3 對應(yīng):未連接姜凄,連接中 政溃,已連接
現(xiàn)在是敲代碼時間:
Phone.cs
public class Phone :Entity
{
State mState = null;
}
public void Request(int cValue)
{
mState.Handle(cValue);
}
public void SetState(State cState)
{
mState=cState;
}
State.cs
public abstract class State
{
Context mContext = null;
public State (Context cContext)
{
mContext = cContext;
}
public abstract void Handle(int cValue);
}
public class ConcreteState01 : State
{
public override void Handle(int cValue)
{
//這里是狀態(tài)過度,由 1 到 2
if(cValue == 2)
{
// ConcreteState02 是連接中
mContext.SetState(New ConcreteState02(mContext) )
}
}
}
...
以上3個具體類态秧,都需要重新定義 Handle 董虱,用來區(qū)分具體的 顯示W(wǎng)IFI圖標(biāo)。這里就省略了申鱼。
void test()
{
Phone tPhone = new Phone();
tPhone .SetState(New ConcreteState01());
if(xxx) //這里是業(yè)務(wù)邏輯愤诱,比如:這個電話目前斷網(wǎng),剛有信號
tPhone.Request(2);
}
ET里邊真實(shí)項(xiàng)目用到最多的就是FSM捐友。網(wǎng)上我看有很多人都實(shí)現(xiàn)過淫半,回頭找到一個好的版本貼到這里。