《PHP教程:詳解PHP中的狀態(tài)模式編程》要點(diǎn):
本文介紹了PHP教程:詳解PHP中的狀態(tài)模式編程,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
PHP編程定義
狀態(tài)模式,又稱狀態(tài)對(duì)象模式(Pattern of Objects for State),狀態(tài)模式就是對(duì)象的行為模式.狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變其行為.這個(gè)對(duì)象看上去就像是改變了它的類一樣
PHP編程UML圖
PHP編程
PHP編程狀態(tài)模式中主要角色
抽象狀態(tài)角色(State):定義一個(gè)接口或抽象類State,用以封裝環(huán)境對(duì)象的一個(gè)特定的狀態(tài)所對(duì)應(yīng)的行為
具體狀態(tài)(ConcreteState)角色:每一個(gè)狀態(tài)類都實(shí)現(xiàn)了環(huán)境(Context)的一個(gè)狀態(tài)所對(duì)應(yīng)的行為
環(huán)境(Context)角色:定義客戶端所感興趣的接口,并且保存一個(gè)具體狀態(tài)類的實(shí)例.這個(gè)具體狀態(tài)類的實(shí)例給出此環(huán)境對(duì)象的現(xiàn)有狀態(tài)
PHP編程
使用場(chǎng)景
考慮一個(gè)在線投票系統(tǒng)的應(yīng)用,要實(shí)現(xiàn)控制同一用戶只能投一票,如果一個(gè)用戶反復(fù)投票,而且投票超過(guò)5次,則判定為惡意刷票,如果投票超過(guò)8次,必要加入黑名單
PHP編程要使用狀態(tài)模式實(shí)現(xiàn),首先要把投票過(guò)程的各種狀態(tài)定義出來(lái),根據(jù)以上描述大致分為四種狀態(tài):正常投票,惡意投票,黑名單投票.然后創(chuàng)建一個(gè)投票管理對(duì)象(相當(dāng)于Context)
PHP編程UML圖
PHP編程
PHP編程示例代碼
PHP編程?
PHP編程
<?php
/**
* 抽象狀態(tài)類
* @author wzy
*
*/
interface VoteState
{
/**
* 需要實(shí)現(xiàn)的公共辦法
*/
public function vote ();
}
/**
* 具體狀態(tài)――正常投票
*
* @author wzy
*
*/
class NormalVoteState implements VoteState
{
public function vote ()
{
echo "這是一個(gè)正常投票!";
}
}
/**
* 具體狀態(tài)――惡意投票
*
* @author wzy
*
*/
class RepeatVoteState implements VoteState
{
public function vote ()
{
echo "這是一個(gè)惡意投票!";
}
}
/**
* 具體狀態(tài)――黑名單投票
*
* @author wzy
*
*/
class BlockVoteState implements VoteState
{
public function vote ()
{
echo "這是一個(gè)黑名單投票!";
}
}
/**
* Context角色
*/
class VoteManager
{
/**
* 投票數(shù)量
*
* @var int
*/
private $vote_count;
/**
* 狀態(tài)類實(shí)例
*
* @var object
*/
private $voteInstance;
/**
* 構(gòu)造函數(shù),初始化成員屬性
*
* @param int $count
*/
public function __construct ($count = 1)
{
$this->vote_count = $count;
}
/**
* 客戶端調(diào)用的接口函數(shù)
*/
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編程回顧狀態(tài)模式
狀態(tài)和行為
所謂對(duì)象的狀態(tài),通常指的就是對(duì)象實(shí)例的屬性的值;而行為指的就是對(duì)象的功能,在具體一點(diǎn)說(shuō),行為大多可以對(duì)應(yīng)到辦法上
PHP編程狀態(tài)模式的功能就是分離狀態(tài)的行為,通過(guò)維護(hù)狀態(tài)的變化,來(lái)調(diào)用不同狀態(tài)對(duì)應(yīng)的功能.也就是說(shuō),狀態(tài)和行為是相關(guān)聯(lián)的,它們的關(guān)系可以描述為:狀態(tài)決定行為
PHP編程由于狀態(tài)是在運(yùn)行期被改變的,因?yàn)樾袨橐矔?huì)在運(yùn)行期根據(jù)狀態(tài)的改變而改變
PHP編程環(huán)境和狀態(tài)處理對(duì)象
在狀態(tài)模式中,環(huán)境(Context)是持有狀態(tài)的對(duì)象,但是環(huán)境本身并不處理跟狀態(tài)相關(guān)的行為,而是把處理狀態(tài)的功能委托給了狀態(tài)對(duì)應(yīng)的狀態(tài)處理類來(lái)處理
PHP編程在具體的狀態(tài)處理中經(jīng)常必要獲取環(huán)境(Context)自身的數(shù)據(jù),可以考慮用抽象類替代接口,這樣可能會(huì)更方便參數(shù)的傳遞
PHP編程客戶端一般只與環(huán)境(Context)交互.客戶端可以用狀態(tài)對(duì)象來(lái)配置一個(gè)環(huán)境(Context),一旦配置完畢,就不再必要和狀態(tài)對(duì)象打交道了.客戶端通常不負(fù)責(zé)運(yùn)行期間的狀態(tài)維護(hù),也不負(fù)責(zé)后續(xù)到底使用哪一個(gè)具體的狀態(tài)處理對(duì)象
歡迎參與《PHP教程:詳解PHP中的狀態(tài)模式編程》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/8803.html