php教程:php设计模式介绍之值对象模式(4)_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

php教程:php设计模式介绍之值对象模式(4)

作者:黑客防线网安PHP教程基地 来源:黑客防线网安PHP教程基地 浏览次数:0

本篇关键词:模式对象教程介绍
黑客防线网安网讯:  另一个重要的概念是对象Monopoly中的租金支付。让我们首先写一个测试实例(测试引导开发)。下面的代码希望用来实现既定的目标。    functionTestRent(){    $game=newMonopoly...
  另一个重要的概念是对象Monopoly中的租金支付让我们首先写一个测试实例(测试引导开发)下面的代码希望用来实现既定的目标。
  
  functionTestRent(){
  
  $game=newMonopoly;
  
  $player1=newPlayer(‘Madeline’);
  
  $player2=newPlayer(‘Caleb’);
  
  $this->assertEqual(1500,$player1->getBalance());
  
  $this->assertEqual(1500,$player2->getBalance());
  
  $game->payRent($player1,$player2,newDollar(26));
  
  $this->assertEqual(1474,$player1->getBalance());
  
  $this->assertEqual(1526,$player2->getBalance());
  
  }
  
  根据这个测试代码我们需要在Monopoly对象中增加payRent()的方法函数来实现一个Player对象去支付租金给另一个Player对象.
  
  ClassMonopoly{
  
  //...
  
  /**
  
  *payrentfromoneplayertoanother
  
  *@paramPlayer$fromtheplayerpayingrent
  
  *@paramPlayer$totheplayercollectingrent
  
  *@paramDollar$renttheamountoftherent
  
  *@returnvoid
  
  */
  
  publicfunctionpayRent($from,$to,$rent){
  
  $to->collect($from->pay($rent));
  
  }
  
  }
  
  payRent()方法函数实现了两个player对象之间($from和$to)的租金支付。方法函数Player::collect()已经被定义了但是Player::pay()必须被添加进去,以便实例$from通过pay()方法支付一定的Dollar数额$to对象中。首先我们定义Player::pay()为:
  
  classPlayer{
  
  //...
  
  publicfunctionpay($amount){
  
  $this->savings=$this->savings->add(-1*$amount);
  
  }
  
  }
  
  但是,我们发现在PHP中你不能用一个数字乘以一个对象(不像其他语言,PHP不允许重载操作符,以便构造函数进行运算)。所以,我们通过添加一个debit()方法函数实现Dollar对象的减的操作。
  
  classDollar{
  
  protected$amount;
  
  publicfunction__construct($amount=0){
  
  $this->amount=(float)$amount;
  
  }
  
  publicfunctiongetAmount(){
  
  return$this->amount;
  
  }
  
  publicfunctionadd($dollar){
  
  returnnewDollar($this->amount+$dollar->getAmount());
  
  }
  
  publicfunctiondebit($dollar){
  
  returnnewDollar($this->amount-$dollar->getAmount());
  
  }
  
  }
  
  引入Dollar::debit()后,Player::pay()函数的操作依然是很简单的。
  
  classPlayer{
  
  //...
  
  /**
  
  *makeapayment
  
  *@paramDollar$amounttheamounttopay
  
  *@returnDollartheamountpayed
  
  */
  
  publicfunctionpay($amount){
  
  $this->savings=$this->savings->debit($amount);
  
  return$amount;
  
  }
  
  }
  
  Player::pay()方法返回支付金额的$amount对象,所以Monopoly::payRent()中的语句$to->collect($from->pay($rent))的用法是没有问题的。这样做的话,如果将来你添加新的“商业逻辑”用来限制一个player不能支付比他现有的余额还多得金额。(在这种情况下,将返回与player的账户余额相同的数值。同时,也可以调用一个“破产异常处理”来计算不足的金额,并进行相关处理。对象$to仍然从对象$from中取得$from能够给予的金额。)
  
  注:术语------商业逻辑
  
  在一个游戏平台的例子上提及的“商业逻辑”似乎无法理解。这里的商业的意思并不是指正常公司的商业运作,而是指因为特殊应用领域需要的概念。请把它认知为“一个直接的任务或目标”,而不是“这里面存在的商业操作”。
  
  所以,既然目前我们讨论的是一个Monopoly,那么这里的“商业逻辑”蕴含的意思就是针对一个游戏的规则而说的。
  
  
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-17382-1.html
网站维护教程更新时间:2012-09-21 05:17:51  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer