《PHP教程:詳解PHP中的狀態模式編程》要點:
本文介紹了PHP教程:詳解PHP中的狀態模式編程,希望對您有用。如果有疑問,可以聯系我們。
PHP編程定義
狀態模式,又稱狀態對象模式(Pattern of Objects for State),狀態模式就是對象的行為模式.狀態模式允許一個對象在其內部狀態改變的時候改變其行為.這個對象看上去就像是改變了它的類一樣
PHP編程UML圖
PHP編程
PHP編程狀態模式中主要角色
抽象狀態角色(State):定義一個接口或抽象類State,用以封裝環境對象的一個特定的狀態所對應的行為
具體狀態(ConcreteState)角色:每一個狀態類都實現了環境(Context)的一個狀態所對應的行為
環境(Context)角色:定義客戶端所感興趣的接口,并且保存一個具體狀態類的實例.這個具體狀態類的實例給出此環境對象的現有狀態
PHP編程
使用場景
考慮一個在線投票系統的應用,要實現控制同一用戶只能投一票,如果一個用戶反復投票,而且投票超過5次,則判定為惡意刷票,如果投票超過8次,必要加入黑名單
PHP編程要使用狀態模式實現,首先要把投票過程的各種狀態定義出來,根據以上描述大致分為四種狀態:正常投票,惡意投票,黑名單投票.然后創建一個投票管理對象(相當于Context)
PHP編程UML圖
PHP編程
PHP編程示例代碼
PHP編程?
PHP編程
<?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);
PHP編程回顧狀態模式
狀態和行為
所謂對象的狀態,通常指的就是對象實例的屬性的值;而行為指的就是對象的功能,在具體一點說,行為大多可以對應到辦法上
PHP編程狀態模式的功能就是分離狀態的行為,通過維護狀態的變化,來調用不同狀態對應的功能.也就是說,狀態和行為是相關聯的,它們的關系可以描述為:狀態決定行為
PHP編程由于狀態是在運行期被改變的,因為行為也會在運行期根據狀態的改變而改變
PHP編程環境和狀態處理對象
在狀態模式中,環境(Context)是持有狀態的對象,但是環境本身并不處理跟狀態相關的行為,而是把處理狀態的功能委托給了狀態對應的狀態處理類來處理
PHP編程在具體的狀態處理中經常必要獲取環境(Context)自身的數據,可以考慮用抽象類替代接口,這樣可能會更方便參數的傳遞
PHP編程客戶端一般只與環境(Context)交互.客戶端可以用狀態對象來配置一個環境(Context),一旦配置完畢,就不再必要和狀態對象打交道了.客戶端通常不負責運行期間的狀態維護,也不負責后續到底使用哪一個具體的狀態處理對象
歡迎參與《PHP教程:詳解PHP中的狀態模式編程》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/8803.html