PHP知识、源码、教程、框架、程序分享! -- PHP社区 关于我们 联系我们 联系电话 联系QQ

PHP编程语言中的观察者模式

发表时间:2014-08-12 点击:

[本文摘要]:PHP编程 语言中的观察者模式 PHP 应用中,通常需要处理数据。在许多情况下,更改一小块数据可能影响你的应用中许多不同部分的代码。例如,一个电子商务站点显示的每一个产品的单...

PHP编程语言中的观察者模式

PHP应用中,通常需要处理数据。在许多情况下,更改一小块数据可能影响你的应用中许多不同部分的代码。例如,一个电子商务站点显示的每一个产品的单价如果显示为用户当地的货币就需要使用当前的汇率进行转换。现在,假设每—个产品项目都是由一个PHP对象从数据库获取并呈现出来的:而货币转换的汇率本身大部分可能是由一个另外的资源获得而并不是产品数据库条目的一部分。让我们在假定这样一个对象有一个display()方法来输出和这个产品相关的HTML页面。

观察者模式允许对象注册到一个特定的时间和,或者数据,并且当这个事件发生或者数据改变时,它会自动通报。通过这个方法,你可以把产品项目开发成一个给予货币汇率的观察者,而且在打印出项目的条目时,你可以驱动一个事件来用正确的汇率更新注册的对象。这么做是为了让对象有机会自我更新并且在display()方法中使用新的数据。

通常,观察者模式是通过使用一个叫Observer的接口实现的,对作为观察者感兴趣的类需要实现这个接口。

例如:

	interface Oboserver {
	  function  notify ($obj);
	}

一个对象想要“可观察”,通常需要一个注册方法,这让观察者对象可以注册它自己。例如,下面的例子可能是我们需要的汇率类:

class ExchangeRate {
	static private $instance = NULL;
	private $observers = array();
	private $exchange_race;
	private function ExchangeRate(){
	}
	static public function getlnstance(){
	  if(self::$instance == NULL) {
	    self::$instance = new ExchangeRate();
	  }
	return self::$instance;
	}
	public  function getExchangeRate (){
	  return $this->$exchange_rate;
	}
	public  function  setExchangeRate ($new_rate){
	  $this->$exchange_rate = $new_rate;
	  $this->notifyObservers();
	}
	public function registerObserver ($obj){
	  $this->observers[] =  $obj;
	}
	function notifyObservers(){
	  foreach ($this->observers as $obj ){
	    $obj->notify($this);
	  }
	}
}
class Productltem implements Observer{
	public function __construct(){
	  ExchangeRate::getinstance()->registerObserver($this);
	}
	public function notify($obj){
	  if ($obj instanceof ExchangeRate){
	    //更新交易率数据
	    print  "Received update! \n";
	  }
	}
}
	$product1  =  new  ProductItem();
	$product2 = new Productitem();
	ExchangeRate::getInstance ()->setExchangeRate (4.5);

这个代码打印出

Received update!

Received update!

尽管例子不完整(ProductItem类没有执行任何实际的操作),但是当最后一行代码执行(setExchangeRate()方法)时,$product1和Sproduct2都会通过他们的notify()方法得到新的汇率值的通报,让它们去重新计算成本。

这个模式可以在许多场合中使用;尤其是在Web开发中,它可以被用来创建对象的架构并通过cookies,GET,POST和其他输入数据来改变数据。

版权声明:本文系技术人员研究整理的智慧结晶,转载勿用于商业用途,并保留本文链接,侵权必究!

本文链接:http://php.aixc.cn/phpzs/phpjc/339.html

声明:本站技术及源码均为原创,转载请勿用于商业用途,并注明出处及原文链接,侵权必究。