php設計模式之狀態(tài)模式實例分析【星際爭霸游戲案例】
本文實例講述了php設計模式之狀態(tài)模式。分享給大家供大家參考,具體如下:
星際的一些兵種會有不止一種狀態(tài),比如坦克可以架起來,機槍兵可以打興奮劑,甚至還有一些被動的,比如被蟲族女王噴灑綠色液體后,敵人的行動變慢。
如果按照一般的思路,每次我們對一個小兵進行操作的時候,比如一輛坦克,我們都要用if判斷他的狀態(tài),這樣代碼中會有很多的if,else或者swith。
不過我們可以發(fā)現(xiàn),我們需要的是他在某個狀態(tài)下的行為,如果把這些行為按照狀態(tài)封裝起來,就可以減少大量的判斷。
待解決的問題:封裝坦克的狀態(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()
{
//這里簡單的輸出當前狀態(tài)
echo "普通狀態(tài)";
}
}
//坦克架起來的狀態(tài)
class TankState_Siege implements TankState
{
//坦克的攻擊方法
public function attack()
{
//這里簡單的輸出當前狀態(tài)
echo "架起來了";
}
}
//坦克類
class Tank
{
//狀態(tài)
public $state;
//坦克的攻擊方法
public function __construct()
{
//新造出來的坦克當然是普通狀態(tài)
$this->state = new TankState_Tank();
}
//設置狀態(tài)的方法,假設參數(shù)為玩家點擊的鍵盤
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()
{
//由當前狀態(tài)自己來處理攻擊
$this->state->attack();
}
}
//新造一輛坦克
$tank = new Tank();
//假設正好有個敵人路過,坦克就以普通模式攻擊了
$tank->attack();
//架起坦克
$tank->setState('s');
//坦克再次攻擊,這次是架起模式
$tank->attack();
?>
用途總結(jié):狀態(tài)模式可以將和狀態(tài)相關的行為和屬性封裝,除了切換狀態(tài)時,其它地方就不需要大量的判斷當前狀態(tài),只要調(diào)用當前狀態(tài)的方法等。
實現(xiàn)總結(jié):用一個接口規(guī)范狀態(tài)類需要實現(xiàn)的方法,比如上面的TankState規(guī)定了attack()。把各個狀態(tài)封裝成類,將不同狀態(tài)下的不同方法放入各自的狀態(tài)類,比如上面的攻擊方法,同時所有的狀態(tài)執(zhí)行接口。原來的事務類,比如上面的Tank類,只負責狀態(tài)切換,一旦需要某一個方法的調(diào)用,只要交給當前狀態(tài)就可以了。
更多關于PHP相關內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
相關文章
windows系統(tǒng)php環(huán)境安裝swoole具體步驟
這篇文章主要介紹了windows系統(tǒng)php環(huán)境安裝swoole具體步驟,swoole目前是比較熱門的一個擴展插件,有需要的同學可以學習下2021-03-03
3個PHP多維數(shù)組轉(zhuǎn)為一維數(shù)組的方法實例
這篇文章主要介紹了3個PHP多維數(shù)組轉(zhuǎn)為一維數(shù)組的方法實例,分別使用foreach、for、while三種循環(huán)方法來實現(xiàn),需要的朋友可以參考下2014-03-03
使用PHP下載CSS文件中的所有圖片【幾行代碼即可實現(xiàn)】
本文主要對使用PHP下載CSS文件中的所有圖片的方法進行介紹,只需幾行代碼即可實現(xiàn),且注釋詳細。下面就跟小編一起來看下吧2016-12-12
2個自定義的PHP in_array 函數(shù),解決大量數(shù)據(jù)判斷in_array的效率問題
大家可能都用過in_array來判斷一個數(shù)據(jù)是否在一個數(shù)組中,一般我們的數(shù)組可能數(shù)據(jù)都比較小,對性能沒什么影響,所以也就不會太在意2014-04-04
windows下apache搭建php開發(fā)環(huán)境
本文詳細介紹了在Windows2003下使用Apache2.2.21/PHP5.3.5/Mysql5.5.19/phpMyAdmin3.4.9搭建php開發(fā)環(huán)境,本文介紹的非常詳細,需要的朋友快來學習吧2015-08-08
php array_pop 刪除數(shù)組最后一個元素實例
這篇文章主要介紹了php array_pop 刪除數(shù)組最后一個元素實例的相關資料,需要的朋友可以參考下2016-11-11

