php设计模式介绍之值对象模式第4/5页

 更新时间:2008年04月13日 22:10:17   作者:  
在所有的最简单的程序中,大多数对象都有一个标识,一个重要的商业应用对象,例如一个Customer或者一个SKU,有一个或者更多的属性---id,name,email地址,这样可以把它从同一个类的其他实例区分开来。此外,对象有一个恒定的标识:它是贯穿于整个应用程序的一个唯一的标识,对于程序员来说,”customer A”在任何地方就是”customer A”,并且只要你的程序在持续运行时"customer A"仍然是"customer A"。 但是一个对象不需要有一个标识。有些对象仅仅是为了描述其他对象的属性。

另一个重要的概念是对象Monopoly中的租金支付。让我们首先写一个测试实例(测试引导开发)。下面的代码希望用来实现既定的目标。

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());
}
根据这个测试代码,我们需要在Monopoly对象中增加payRent()的方法函数来实现一个Player对象去支付租金给另一个Player对象.

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()方法函数实现了两个player对象之间($from和$to)的租金支付。方法函数Player::collect()已经被定义了,但是Player::pay()必须被添加进去,以便实例$from通过pay()方法支付一定的Dollar数额$to对象中。首先我们定义Player::pay()为:

class Player {
// ...
public function pay($amount) {
$this->savings = $this->savings->add(-1 * $amount);
}
}
但是,我们发现在PHP中你不能用一个数字乘以一个对象(不像其他语言,PHP不允许重载操作符,以便构造函数进行运算)。所以,我们通过添加一个debit()方法函数实现Dollar对象的减的操作。

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()函数的操作依然是很简单的。

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对象,所以Monopoly::payRent()中的语句$to->collect($from->pay($rent))的用法是没有问题的。这样做的话,如果将来你添加新的“商业逻辑”用来限制一个player不能支付比他现有的余额还多得金额。(在这种情况下,将返回与player的账户余额相同的数值。同时,也可以调用一个“破产异常处理”来计算不足的金额,并进行相关处理。对象$to仍然从对象$from中取得$from能够给予的金额。)

注:术语------商业逻辑

在一个游戏平台的例子上提及的“商业逻辑”似乎无法理解。这里的商业的意思并不是指正常公司的商业运作,而是指因为特殊应用领域需要的概念。请把它认知为 “一个直接的任务或目标”,而不是“这里面存在的商业操作”。

所以,既然目前我们讨论的是一个Monopoly,那么这里的 “商业逻辑”蕴含的意思就是针对一个游戏的规则而说的。

相关文章

  • php中stdClass的用法分析

    php中stdClass的用法分析

    这篇文章主要介绍了php中stdClass的用法,实例分析了stdClass的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 简单介绍win7下搭建apache+php+mysql开发环境

    简单介绍win7下搭建apache+php+mysql开发环境

    这里给大家介绍的是Win7下搭建“PHP+Apache+MySql”网站运行环境详细方法步骤,十分的细致全面,有需要的小伙伴可以参考下。
    2015-08-08
  • 在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境

    在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境

    这篇文章主要介绍了在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境,需要的朋友可以参考下
    2016-04-04
  • php无限级分类实现方法分析

    php无限级分类实现方法分析

    这篇文章主要介绍了php无限级分类实现方法,结合2个简单实例形式分析了php通过递归与普通算法实现无限级分类的相关操作技巧,需要的朋友可以参考下
    2016-10-10
  • PHP XML操作类DOMDocument

    PHP XML操作类DOMDocument

    不得不自已写一个.XML 的操作一直没有用过.下面是自己搜集的XML操作类
    2009-12-12
  • PHP递归算法的详细示例分析

    PHP递归算法的详细示例分析

    我们在建设一个网站的时候,程序员们首选的当属PHP语言。我们对PHP还是比较熟悉的,接下来我们将会为大家介绍一下PHP递归算法
    2013-02-02
  • php实现Linux服务器木马排查及加固功能

    php实现Linux服务器木马排查及加固功能

    这篇文章主要介绍了php实现Linux服务器木马排查及加固功能,本文给出了根据特征码查找、搜索最近被修改的文件、修改php.ini、修改nginx.conf等方法,需要的朋友可以参考下
    2014-12-12
  • 统计PHP目录中的文件数方法

    统计PHP目录中的文件数方法

    在本文里小编给大家分享了关于统计PHP目录中的文件数方法和相关知识点,有需要的朋友们参考下。
    2019-03-03
  • php中get_object_vars()方法用法实例

    php中get_object_vars()方法用法实例

    这篇文章主要介绍了php中get_object_vars()方法用法,实例分析了get_object_vars()方法获取对象中属性的使用技巧,需要的朋友可以参考下
    2015-02-02
  • php去除字符串中空字符的常用方法小结

    php去除字符串中空字符的常用方法小结

    这篇文章主要介绍了php去除字符串中空字符的常用方法,实例分析了php中的trim()、ltrim()、rtrim()及chop()等函数的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03

最新评论