定義
狀態模式,又稱狀態對象模式(Pattern of Objects for State),狀態模式就是對象的行為模式。狀態模式允許一個對象在其內部狀態改變的時候改變其行為。這個對象看上去就像是改變了它的類一樣
UML圖

狀態模式中主要角色
抽象狀態角色(State):定義一個接口或抽象類State,用以封裝環境對象的一個特定的狀態所對應的行為
具體狀態(ConcreteState)角色:每一個狀態類都實現了環境(Context)的一個狀態所對應的行為
環境(Context)角色:定義客戶端所感興趣的接口,并且保留一個具體狀態類的實例。這個具體狀態類的實例給出此環境對象的現有狀態
使用場景
考慮一個在線投票系統的應用,要實現控制同一用戶只能投一票,如果一個用戶反復投票,而且投票超過5次,則判定為惡意刷票,如果投票超過8次,需要加入黑名單
要使用狀態模式實現,首先要把投票過程的各種狀態定義出來,根據以上描述大致分為四種狀態:正常投票,惡意投票,黑名單投票。然后創建一個投票管理對象(相當于Context)
UML圖

示例代碼
<?php /** * 抽象狀態類 * @author wzy * */ interface VoteState { /** * 需要實現的公共方法 */ public function vote (); } /** * 具體狀態——正常投票 * * @author wzy * */ class NormalVoteState implements VoteState { public function vote () { echo "這是一個正常投票!"; } } /** * 具體狀態——惡意投票 * * @author wzy * */ class RepeatVoteState implements VoteState { public function vote () { echo "這是一個惡意投票!"; } } /** * 具體狀態——黑名單投票 * * @author wzy * */ class BlockVoteState implements VoteState { public function vote () { echo "這是一個黑名單投票!"; } } /** * Context角色 */ class VoteManager { /** * 投票數量 * * @var int */ private $vote_count; /** * 狀態類實例 * * @var object */ private $voteInstance; /** * 構造函數,初始化成員屬性 * * @param int $count */ public function __construct ($count = 1) { $this->vote_count = $count; } /** * 客戶端調用的接口函數 */ public function setState ($count) { if (! is_null($count)) { $this->vote_count = $count; } if ($this->vote_count < 5) { $this->voteInstance = new NormalVoteState(); } else if ($this->vote_count < 8) { $this->voteInstance = new RepeatVoteState(); } else { $this->voteInstance = new BlockVoteState(); } $this->voteInstance->vote(); } } /** * 模擬客戶端操作 */ $object = new VoteManager(); $object->setState(1); echo "<br>"; $object->setState(6); echo "<br>"; $object->setState(10);
新聞熱點
疑難解答