详细例子:
让我们在一下更加复杂的例子中查看值对象模式的功能。
让我们开始实现一个的基于PHP5中Dollar类中的一个Monopoly游戏。
第一个类Monopoly的框架如下:
class Monopoly { protected $go_amount; /** * game constructor * @return void */ public function __construct() { $this->go_amount = new Dollar(200); } /** * pay a player for passing 揋o?/span> * @param Player $player the player to pay * @return void */ public function passGo($player) { $player->collect($this->go_amount); } }
目前,Monopoly的功能比较简单。构造器创建一个Dollar类的实例$go_amount,设定为200,实例go_amount常常被passtGo()函数调用,它带着一个player参数,并让对象player的函数collect为player机上200美元.
Player类的声明请看下面代码,Monoplay类调用带一个Dollar参数的Player::collect()方法。然后把Dollar的数值加到Player的现金余额上。另外,通过判断Player::getBalance()方法函数返回来的余额,我们可以知道使访问当前Player和Monopoly对象实例是否在工作中。
class Player { protected $name; protected $savings; /** * constructor * set name and initial balance * @param string $name the players name * @return void */ public function __construct($name) { $this->name = $name; $this->savings = new Dollar(1500); } /** * receive a payment * @param Dollar $amount the amount received * @return void */ public function collect($amount) { $this->savings = $this->savings->add($amount); } * return player balance * @return float */ public function getBalance() { return $this->savings->getAmount(); } }
上边已经给出了一个Monopoly和Player类,你现在可以根据目前声明的几个类定义进行一些测试了。
MonopolyTestCase的一个测试实例可以像下面这样写:
class MonopolyTestCase extends UnitTestCase { function TestGame() { $game = new Monopoly; $player1 = new Player(‘Jason’); $this->assertEqual(1500, $player1->getBalance()); $game->passGo($player1); $this->assertEqual(1700, $player1->getBalance()); $game->passGo($player1); $this->assertEqual(1900, $player1->getBalance()); } }
如果你运行MonopolyTestCase这个测试代码,代码的运行是没有问题的。现在可以添加一些新的功能。
出处:phpchina
责任编辑:bluehearts
上一页 php设计模式介绍之值对象模式 [2] 下一页 php设计模式介绍之值对象模式 [4]
◎进入论坛网络编程版块参加讨论
|