详细例子:
让我们在一下更加复杂的例子中查看值对象模式的功能
。 让我们开始实现一个的基于
PHP5中Dollar类中的一个Monopoly
游戏。 第一个类Monopoly的框架如下:
classMonopoly{
protected$go_amount;
/**
*gameconstructor
*@returnvoid */
publicfunction__construct(){
$this->go_amount=newDollar(200);
}
/**
*payaplayerforpassing揋o?/span>
*@paramPlayer$playertheplayertopay *@returnvoid */
publicfunctionpassGo($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对象实例是否在工作中。
classPlayer{
protected$name;
protected$savings;
/**
*constructor
*setnameandinitialbalance
*@paramstring$nametheplayersname *@returnvoid */
publicfunction__construct($name){
$this->name=$name;
$this->savings=newDollar(1500);
}
/**
*receiveapayment
*@paramDollar$amounttheamountreceived *@returnvoid */
publicfunctioncollect($amount){
$this->savings=$this->savings->add($amount);
}
*returnplayerbalance
*@returnfloat */
publicfunctiongetBalance(){
return$this->savings->getAmount();
}
}
上边已经给出了一个Monopoly和Player类,你现在可以根据目前声明的几个类定义进行一些测试了。
MonopolyTestCase的一个测试实例可以像下面这样写:
classMonopolyTestCaseextendsUnitTestCase{
functionTestGame(){
$game=newMonopoly;
$player1=newPlayer(‘Jason’);
$this->assertEqual(1500,$player1->getBalance());
$game->passGo($player1);
$this->assertEqual(1700,$player1->getBalance());
$game->passGo($player1);
$this->assertEqual(1900,$player1->getBalance());
}
}
如果你运行MonopolyTestCase这个测试代码,代码的运行是没有问题的。现在可以添加一些新的功能。