另一個(gè)重要的概念是對(duì)象Monopoly中的租金支付。讓我們首先寫一個(gè)測(cè)試實(shí)例(測(cè)試引導(dǎo)開發(fā))。下面的代碼希望用來實(shí)現(xiàn)既定的目標(biāo)。
function TestRent() { $game = new Monopoly; $player1 = new Player(‘Madeline’); $player2 = new Player(‘Caleb’); $this->assertEqual(1500, $player1->getBalance()); $this->assertEqual(1500, $player2->getBalance()); $game->payRent($player1, $player2, new Dollar(26)); $this->assertEqual(1474, $player1->getBalance()); $this->assertEqual(1526, $player2->getBalance()); }
根據(jù)這個(gè)測(cè)試代碼,我們需要在Monopoly對(duì)象中增加payRent()的方法函數(shù)來實(shí)現(xiàn)一個(gè)Player對(duì)象去支付租金給另一個(gè)Player對(duì)象.
Class Monopoly { // ... /** * pay rent from one player to another * @param Player $from the player paying rent * @param Player $to the player collecting rent * @param Dollar $rent the amount of the rent * @return void */ public function payRent($from, $to, $rent) { $to->collect($from->pay($rent)); } }
payRent()方法函數(shù)實(shí)現(xiàn)了兩個(gè)player對(duì)象之間($from和$to)的租金支付。方法函數(shù)Player::collect()已經(jīng)被定義了,但是Player::pay()必須被添加進(jìn)去,以便實(shí)例$from通過pay()方法支付一定的Dollar數(shù)額$to對(duì)象中。首先我們定義Player::pay()為:
class Player { // ... public function pay($amount) { $this->savings = $this->savings->add(-1 * $amount); } }
但是,我們發(fā)現(xiàn)在PHP中你不能用一個(gè)數(shù)字乘以一個(gè)對(duì)象(不像其他語言,PHP不允許重載操作符,以便構(gòu)造函數(shù)進(jìn)行運(yùn)算)。所以,我們通過添加一個(gè)debit()方法函數(shù)實(shí)現(xiàn)Dollar對(duì)象的減的操作。
class Dollar { protected $amount; public function __construct($amount=0) { $this->amount = (float)$amount; } public function getAmount() { return $this->amount; } public function add($dollar) { return new Dollar($this->amount + $dollar->getAmount()); } public function debit($dollar) { return new Dollar($this->amount - $dollar->getAmount()); } }
引入Dollar::debit()后,Player::pay()函數(shù)的操作依然是很簡(jiǎn)單的。
class Player { // ... /** * make a payment * @param Dollar $amount the amount to pay * @return Dollar the amount payed */ public function pay($amount) { $this->savings = $this->savings->debit($amount); return $amount; } }
Player::pay()方法返回支付金額的$amount對(duì)象,所以Monopoly::payRent()中的語句$to->collect($from->pay($rent))的用法是沒有問題的。這樣做的話,如果將來你添加新的“商業(yè)邏輯”用來限制一個(gè)player不能支付比他現(xiàn)有的余額還多得金額。(在這種情況下,將返回與player的賬戶余額相同的數(shù)值。同時(shí),也可以調(diào)用一個(gè)“破產(chǎn)異常處理”來計(jì)算不足的金額,并進(jìn)行相關(guān)處理。對(duì)象$to仍然從對(duì)象$from中取得$from能夠給予的金額。)
注:術(shù)語------商業(yè)邏輯
在一個(gè)游戲平臺(tái)的例子上提及的“商業(yè)邏輯”似乎無法理解。這里的商業(yè)的意思并不是指正常公司的商業(yè)運(yùn)作,而是指因?yàn)樘厥鈶?yīng)用領(lǐng)域需要的概念。請(qǐng)把它認(rèn)知為 “一個(gè)直接的任務(wù)或目標(biāo)”,而不是“這里面存在的商業(yè)操作”。
所以,既然目前我們討論的是一個(gè)Monopoly,那么這里的 “商業(yè)邏輯”蘊(yùn)含的意思就是針對(duì)一個(gè)游戲的規(guī)則而說的。
出處:phpchina
責(zé)任編輯:bluehearts
上一頁 php設(shè)計(jì)模式介紹之值對(duì)象模式 [3] 下一頁 php設(shè)計(jì)模式介紹之值對(duì)象模式 [5]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|