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

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

详细例子:

让我们在一下更加复杂的例子中查看值对象模式的功能。

让我们开始实现一个的基于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这个测试代码,代码的运行是没有问题的。现在可以添加一些新的功能。

相关文章

  • 8个PHP数组面试题

    8个PHP数组面试题

    这篇文章主要介绍了8个PHP数组面试题,例如写函数创建长度为10的数组,数组中的元素为递增的奇数,首项为1、创建长度为10的数组,数组中的数为递增的等比数,比值为3,首项为等题目,需要的朋友可以参考下
    2015-06-06
  • PHP中session使用方法详解

    PHP中session使用方法详解

    在PHP开发中对比起Cookie,session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 session 的使用
    2007-03-03
  • PHP运行SVN命令显示某用户的文件更新记录的代码

    PHP运行SVN命令显示某用户的文件更新记录的代码

    使用SVN开发者们平时开发或代码上线过程中需要知道某个时间段内修改或添加过那些文件,所以用PHP写了个小程序,直接在浏览器中调用即可
    2014-01-01
  • 浅谈PHP中Stream(流)

    浅谈PHP中Stream(流)

    Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数。Stream可以翻译为“流”,在Java里,流是一个很重要的概念。
    2015-06-06
  • php日志函数error_log用法实例分析

    php日志函数error_log用法实例分析

    这篇文章主要介绍了php日志函数error_log用法,结合实例形式分析了php日志函数error_log相关的配置文件设置、函数功能、用法与使用注意事项,需要的朋友可以参考下
    2019-09-09
  • 网站用php实现paypal整合方法

    网站用php实现paypal整合方法

    虽然在中国paypal不是很流行,但如果把范围扩大到世界的话,那paypal无疑就是老大了。
    2010-11-11
  • 微信公众号点击菜单即可打开并登录微站的实现方法

    微信公众号点击菜单即可打开并登录微站的实现方法

    这篇文章主要介绍了微信公众号点击菜单即可打开并登录微站的实现方法,以实例形式对回调、菜单及参数的处理等具体实现步骤与功能代码都做了较为详细的描述,对于微信公众号的开发来说具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • php操作sqlserver关于时间日期读取的小小见解

    php操作sqlserver关于时间日期读取的小小见解

    以前一直在用mysql对sqlserver不是很熟悉,于是摸着石头过河。没有别的至少mysql和sqlserver还算是亲戚 做条件查询的时候。出现了问题
    2009-11-11
  • Php获取金书网的书名的实现代码

    Php获取金书网的书名的实现代码

    php获取金书网的书名的实现代码。
    2010-06-06
  • 兼容PHP5的PHP目录管理函数库

    兼容PHP5的PHP目录管理函数库

    php下进行目录的一些操作,经常用到的方法
    2008-07-07

最新评论