观察者模式,又叫做订阅-发布模式。当一个对象的改变需要同时改变多个对象的时候,可以使用法不这模式。设计模式中的观察者模式,就是为了解除类之间的耦合,使双方都依赖于抽象而不是依赖于具体。在实际生活中,比如我们更换了手机号,需要通知大家的时候,我们就是主题,或者通知者,而需要通知的人就是观察者列表,一条短信的群发告诉大家,就是观察者模式的应用。

<?php
//主题者、通知者抽象类。
abstract class Subject{
	private $observerList = array();
	public function add(&$obj, $action){
		$this->observerList[] = array('obj'=>$obj, 'action'=>$action);
	}
	public function notice(){
		foreach($this->observerList as $observer){
			$obj = $observer['obj'];
			$action = $observer['action'];
			$obj->$action;
		}
	}
}
//具体的通知者
class I extends Subject{
	private $status;
	public function getStatus(){
		return $this->status;
	}
	public function setStatus($status){
		$this->status = $status;
	}
}
//观者者抽象类
abstract class Observer{
	public function sendSms(){
	
	}
}
//具体的观察者
class ConcreteObserver extends Observer{
	private $name;
	private $status;
	private $objSubject;
	public function __construct($name, $objSubject){
		$this->name = $name;
		$this->objSubject = $objSubject;
	}
	public function sendSms(){
		$status = $this->objSubject->getStatus();
		echo '观察者'.$this->name.'收到的状态是'.$status.'<br>';
	}
}
//客户端/接口
$i = new I();
$i->setStatus('更换手机号码了。');
$friend1 = new ConcreteObserver('小明', $i);
$friend2 = new ConcreteObserver('小红', $i);
$friend3 = new ConcreteObserver('小黄', $i);
$i->add($friend1, 'sendSms');
$i->add($friend2, 'sendSms');
$i->add($friend3, 'sendSms');
$i->notice();
?>

标签: PHP, 设计模式, 观察者模式

添加新评论