web development blog

> 编程 PHP设计模式之观察者模式

php设计模式笔记,第四个是观察者模式(Observer),也有其他叫法如:发布-订阅模式、从属者模式、源收听者模式;这个模式是一对多的关系,当被观察者的被监听对象的某一状态发生改变,就会主动通知依赖它的观察者,然后根据这个状态做出相应的处理。

 

观察者模式实现原理:在被观察者类注册观察者,当状态改变时,通知观察者(这里并非观察者直接调用处理方法,而是被观察者用一个方法去通知观察者,而观察者对象接到通知后才做出相应的处理);

 

观察者模式的优点:非常灵活,可以快速(添加/取消)观察者,较少代码耦合,高度重用。

 

php实现观察者模式:

1.php标准类库的SplSubject 和 SplObserver内置接口实现;

2.自己定义接口实现

 

方式一:实现php内置接口

/**
 * php Spl
 *	
 * 接口
 * SplSubject 
 * 	  |----	attach: 新增一个观察者
 * 	  |----	detach: 删除一个观察者
 * 	  |----	notify: 通知观察对象
 *
 * SplObserver
 * 	  |----	update: 被观察者对象改变后相应的操作
 */

具体代码演示:

class SubjectPhp implements SplSubject {
	
	/**
	 * 保存依赖对象
	 * @var array
	 */
	private $observers = array();
	
	/**
	 * 模拟状态改变
	 */
	public $status = '';
	
	/**
	 * 新增一个观察者
	 * @see SplSubject::attach()
	 */
	public function attach(SplObserver $observer){
		$this->observers[] = $observer;
	}
	
	/**
	 * 删除一个观察者
	 * @see SplSubject::detach()
	 */
	public function detach(SplObserver $observer){
		if(is_array($this->observers) && count($this->observers) >= 1){
			if(false!=($key = array_search($observer,$this->observers))){
				unset($this->observers[$key]);
			}
		}
	}
	
	/**
	 * 状态改变,通知观察者
	 */
	public function notify(){
		foreach ($this->observers as $observer){
			$observer->update($this);
		}
	}
	
	/**
	 * 模拟状态改变
	 */
	public function statusChang($v){
		$this->status = $v;
		$this->notify();
	} 
}

/**
 * 观察者类
 */
class ObserverPhp implements SplObserver {
	
	/**
	 * 观察者标识
	 * @var string
	 */
	private $name = '';
	
	public function __construct($name=''){
		$this->name = $name;
	}
	
	public function update(SplSubject $o){
		echo '观察者: '.$this->name.' < 发现 > 被观察对象 '.$o->status;
	}
}
	

方式二:自定义接口实现

/**
 * 自定义接口实现
 *	
 * 接口
 * ISubject 
 * 	  |----	addObserver: 新增一个观察者
 * 	  |----	removeObserver: 删除一个观察者
 * 	  |----	trigger: 通知观察对象
 *
 * IObserver
 * 	  |----	doAction: 被观察者对象改变后相应的操作
 */

例子演示输入日志:

/**

demo 1:

观察者: 小A < 发现 > 被观察对象 2013-01-03 15:32:05 status 状态改变.

观察者: 小B < 发现 > 被观察对象 2013-01-03 15:32:05 status 状态改变.

观察者: 小A < 发现 > 被观察对象 2013-01-03 15:32:10 status 状态改变.

demo 2: 警察抓小偷

=====未被发现,正常情况=====

小偷(A)[2013-01-03 15:32:10]:负责放风.

小偷(B)[2013-01-03 15:32:10]:负责开锁.

警察(A)[2013-01-03 15:32:10]:巡逻.

警察(B)[2013-01-03 15:32:10]:巡逻.

=====5秒后,被发现=====

小偷(A)[2013-01-03 15:32:15]:不好,被警察发现了,快跑.

小偷(B)[2013-01-03 15:32:15]:知道了,分别跑,老地方见.

警察(A)[2013-01-03 15:32:15]:有小偷,警察B快过来.

警察(B)[2013-01-03 15:32:15]:收到,马上追.
* 
*/

演示demo附件下载: php观察者模式

-留言评论-

  • 留言载入中...

-拍砖-

 

首页|前端技术|编程/php|生活|关于我

Copyright © 2012 wmhfly.com