设计模式PHP5实现之----观察者(Observer)

<?php
/**
* 观察者模式
*
* 观察者模式定义了一个一对多的依赖关系
* 让一个或多个观察者对象监察一个主题对象
* 这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象
* 使这些观察者对象能够自动更新。
*
* @author  doodoo<pwtitle@gmail.com>
*/

 

/**
* 一个抽象的主题接口即被观察者
*/
interface Subject{
 public function attach(Observer $observer);
 public function detach(Observer $observer);
 public function notifyObservers();
}

/**
* 具体的被观察者
* 实际接口
*/
class MySubject implements Subject {
 private $observers = array();
 public function attach(Observer $observer){
  $this->observers[] = $observer;
 }
 
 public function detach(Observer $observer){
  $key = array_search($observer,$this->observers);
  if(false!=$key){
   unset($this->observers[$key]);
  }
 }
 
 public function notifyObservers(){
  foreach ($this->observers as $observer) {
   if($observer instanceof Observer){
    $observer->update();
   }
  }
 }
 
 /**
 * 取得观察者总数
 */
 public function getCountObservers(){
  return sizeof($this->observers);
 }
}


/**
* 观察者的接口
*/
interface Observer{
 public function update();
}

/**
* 具体观察者,用来获得主题的通知
*/
class MyObserver implements Observer {
 
 private $id = null;
 
 public function __construct(){
  $this->id = uniqid();
 }
 public function update(){
  echo "收到通知!";
  echo $this->id;
  echo "<BR>/r/n";
 }
}

$observer1 = new MyObserver(1);
$observer2 = new MyObserver(2);
$observer3 = new MyObserver(3);

$subject = new MySubject();
$subject->attach($observer1);
$subject->attach($observer2);
$subject->attach($observer3);
echo "观察者总数:".$subject->getCountObservers()."<BR>/r/n";

$subject->notifyObservers();
echo "/r/n";

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值