您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)怎么在php中應(yīng)用狀態(tài)模式,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
待解決的問(wèn)題:封裝坦克的狀態(tài),讓狀態(tài)自己去控制行為。
思路:把狀態(tài)作為屬性,兵種類本身只控制狀態(tài)的變化,具體的行為由狀態(tài)類定義。
狀態(tài)(State)模式示例:
<?php //坦克狀態(tài)的接口 interface TankState { //坦克的攻擊方法 public function attack(); } //坦克普通狀態(tài) class TankState_Tank implements TankState { //坦克的攻擊方法 public function attack() { //這里簡(jiǎn)單的輸出當(dāng)前狀態(tài) echo "普通狀態(tài)"; } } //坦克架起來(lái)的狀態(tài) class TankState_Siege implements TankState { //坦克的攻擊方法 public function attack() { //這里簡(jiǎn)單的輸出當(dāng)前狀態(tài) echo "架起來(lái)了"; } } //坦克類 class Tank { //狀態(tài) public $state; //坦克的攻擊方法 public function __construct() { //新造出來(lái)的坦克當(dāng)然是普通狀態(tài) $this->state = new TankState_Tank(); } //設(shè)置狀態(tài)的方法,假設(shè)參數(shù)為玩家點(diǎn)擊的鍵盤 public function setState($key) { //如果按了s if($key = 's') { $this->state = new TankState_Siege(); } //如果按了t elseif($key = 't') { $this->state = new TankState_Tank(); } } //坦克的攻擊方法 public function attack() { //由當(dāng)前狀態(tài)自己來(lái)處理攻擊 $this->state->attack(); } } //新造一輛坦克 $tank = new Tank(); //假設(shè)正好有個(gè)敵人路過(guò),坦克就以普通模式攻擊了 $tank->attack(); //架起坦克 $tank->setState('s'); //坦克再次攻擊,這次是架起模式 $tank->attack(); ?>
用途總結(jié):狀態(tài)模式可以將和狀態(tài)相關(guān)的行為和屬性封裝,除了切換狀態(tài)時(shí),其它地方就不需要大量的判斷當(dāng)前狀態(tài),只要調(diào)用當(dāng)前狀態(tài)的方法等。
實(shí)現(xiàn)總結(jié):用一個(gè)接口規(guī)范狀態(tài)類需要實(shí)現(xiàn)的方法,比如上面的TankState規(guī)定了attack()。把各個(gè)狀態(tài)封裝成類,將不同狀態(tài)下的不同方法放入各自的狀態(tài)類,比如上面的攻擊方法,同時(shí)所有的狀態(tài)執(zhí)行接口。原來(lái)的事務(wù)類,比如上面的Tank類,只負(fù)責(zé)狀態(tài)切換,一旦需要某一個(gè)方法的調(diào)用,只要交給當(dāng)前狀態(tài)就可以了。
關(guān)于怎么在php中應(yīng)用狀態(tài)模式就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。