定義
狀態模式,又稱狀態物件模式(pattern of objects for state),狀態模式就是物件的行為模式。狀態模式允許乙個物件在其內部狀態改變的時候改變其行為。這個物件看上去就像是改變了它的類一樣
uml圖
狀態模式中主要角色
抽象狀態角色(state):定義乙個介面或抽象類state,用以封裝環境物件的乙個特定的狀態所對應的行為
具體狀態(concretestate)角色:每乙個狀態類都實現了環境(context)的乙個狀態所對應的行為
環境(context)角色:定義客戶端所感興趣的介面,並且保留乙個具體狀態類的例項。這個具體狀態類的例項給出此環境物件的現有狀態
使用場景
考慮乙個**投票系統的應用,要實現控制同一使用者只能投一票,如果乙個使用者反覆投票,而且投票超過5次,則判定為惡意刷票,如果投票超過8次,需要加入黑名單
要使用狀態模式實現,首先要把投票過程的各種狀態定義出來,根據以上描述大致分為四種狀態:正常投票,惡意投票,黑名單投票。然後建立乙個投票管理物件(相當於context)
uml圖
示例**
php
/**
* 抽象狀態類
* @author wzy
* */
inte***ce votestate
/**
* 具體狀態——正常投票
* * @author wzy
*
*/ class normalvotestate implements votestate
} /**
* 具體狀態——惡意投票
* * @author wzy
*
*/ class repeatvotestate implements votestate
} /**
* 具體狀態——黑名單投票
* * @author wzy
*
*/ class blockvotestate implements votestate
} /**
* context角色
*/ class votemanager
/**
* 客戶端呼叫的介面函式
*/ public function setstate ($count)
if ($this->vote_count < 5) else
if ($this->vote_count < 8) else
$this->voteinstance->vote();
} }
/**
* 模擬客戶端操作
*/ $object = new votemanager();
$object->setstate(1);
echo "
"; $object->setstate(6);
echo "
"; $object->setstate(10);
回顧狀態模式
狀態和行為
所謂物件的狀態,通常指的就是物件例項的屬性的值;而行為指的就是物件的功能,在具體一點說,行為大多可以對應到方法上
狀態模式的功能就是分離狀態的行為,通過維護狀態的變化程式設計客棧,來呼叫不同狀態對應的功能。也就是說,狀態和行為是相關聯的,它們的關係可以描述為:狀態決定行為
由於狀態是在執行程式設計客棧期被改變的,因為行為也會在執行期根據狀態的改變而改變
環境和狀態處理物件
在狀態模式中,環境(context)是持有狀態的物件,但是環境自己並不處理跟狀態相關的行為,而是把處理狀態的功能委託給了狀態對應的狀態處理類來處理
在具體的狀態處理中經常需要獲取環境(context)自身的資料,可以考慮用抽象類替代介面,這樣可能會更方便引數的傳遞
客戶端一般只與環境(context)互動。客戶端可以用狀態物件來配置乙個環境(context),一旦配置完畢,就不再需要和狀態物件打交道了。客戶端通常不負責執行期間的狀態維護,也不負責後續到底使用哪乙個具體的狀態處理物件
本文標題: 詳解php中的狀態模式程式設計
本文位址:
php中的狀態模式
參考 狀態模式當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。具體狀態 amstate 實現抽象狀態定義的介面。1.乙個物件的行為取決...
狀態模式 詳解
當乙個物件在內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類 行為型模式 從網上找到的例圖 電梯狀態 function liftstate 開門 this.open function 關門 this.close function 執行 this.running function 停止 th...
狀態模式 詳解
當乙個物件在內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類 行為型模式 從網上找到的例圖 created by george on 16 7 10.電梯狀態 function liftstate 開門 this.open function 關門 this.close function 執...