代码说

code is poetry

代码说    
碎碎念:位我上者,灿烂星空,道德律令,在我心中。  换一换

php设计模式之值对象模式

作者:coderzheng 发布于:2014-7-9 18:33 Wednesday 分类:php  阅读模式

节选自<<php设计模式>>,此书由Marco Tabini & Associates, Inc.出版,原作者是Jason E. Sweat。此书的英文版版权由Jason E. Sweat和Marco Tabini & Associates, Inc.公司拥有。

来看下面的程序:

<?php
class BadDollar {
  public function __construct($amount=0) {
    $this->amount = (float)$amount;
  }

  public function getAmount() {
    return $this->amount;
  }

  public function add($dollar) {
    $this->amount += $dollar->getAmount();
  }
}

class Work {
  protected $salary;

  public function __construct() {
    $this->salary = new BadDollar(200);
  }

  public function payDay() {
    return $this->salary;
  }
}

class Person {
  public $wallet;
}

$job = new Work;
$p1 = new Person;
$p2 = new Person;
$p1->wallet = $job->payDay();
if (200 == $p1->wallet->getAmount()) {
  echo "aaa";
} else {
  echo "bbb";
}
echo "<br />";
$p2->wallet = $job->payDay();

if (200 == $p2->wallet->getAmount()) {
    echo "aaa";
} else {
  echo "bbb";
}
echo "<br />";

$p1->wallet->add($job->payDay());
if (400 == $p1->wallet->getAmount()) {
  echo "aaa";
} else {
  echo "bbb";
}
echo "<br />";
//this is bad — actually 400
if (200 == $p2->wallet->getAmount()) {
  echo "aaa";
} else {
  echo "bbb";
}
echo "<br />";
//this is really bad — actually 400
if (200 == $job->payDay()->getAmount()) {
  echo "aaa";
} else {
  echo "bbb"; 
}  

程序输出的结果如下图:


前面两个aaa不难理解,第三个aaa也容易理解,p1的wallet属性执行完add方法后增加了200,因此变成了400。但是为什么后面两个输出的是bbb即$p2->wallet和$job->payDay()中的值也变成了400呢?问题出在哪里呢?

我们向程序中加入适当的代码进行跟踪:



注释部分解释了发生的一切。接下来接着看值对象模式设计的初衷:



遵循上面的原则,我们对程序进行了改进:

// 重新设计的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());
	}
}

// Work类也要跟着变化
class Work2 {
	protected $salary;

	public function __construct() {
		$this->salary = new Dollar(200);
	}

	public function payDay() {
		return $this->salary;
	}
}

class Person {
	public $wallet;
}

$job2 = new Work2();
$p1 = new Person();
$p2 = new Person();
$p1->wallet = $job->payDay();
if (200 == $p1->wallet->getAmount()) {
	echo "aaa";
} else {
	echo "bbb";
}
echo "<br />";
$p2->wallet = $job->payDay();

if ($p1->wallet===$p2->wallet) {
	echo "ccc";
} else {
	echo "ddd";
}
exit;
我们看到这一次$p1->wallet不再恒等于$p2->wallet,说明它们分属于两个不同的实例了。

标签: php php设计模式

你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个博客的所有文章。
上一篇: php设计模式之单例模式  |  下一篇:在dev-c++编辑器中调试c++程序时碰到的问题