注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Copper peas ' Bolg

Keep On Moving...This Is My Life...

 
 
 

日志

 
 

【原】 PHP 设计模式八之观察者设计模式  

2011-06-13 10:30:12|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<?php
/**
 * 订阅周刊  观察者设计模式【这采用PHP的SPL内置接口来实现,也可以自己定义接口】
 * 定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
 * @anthor Chen Wei Han <csq-3@163.com>
 * @copyright Chen Wei Han 2011.06.13
 * @link http://csq-3.blog.163.com
 * @package demo
 * @version $Id: observer.php 1 2011-06-13
 */

/**
 * 被观察者具体角色类,继承SPL的接口
 */
class ConcreteSubject implements SplSubject
{
   private $_obeservers;
   private $value;
  
   /**
    *
    * 观察者对象角色容器数组
    */
   public function __construct()
   {
      $this->_observers = array();
   }
  
   /**
    * 增加观察者对象角色
    * @param Observer $observer
    * @return arr
    */
     public function attach(SplObserver $observer)
     { 
      //不分类观察者
        return array_push($this->_observers, $observer);
     }
    
     /*
     public function attache(SplObserver $observer,$type)
     {
      //分类观察者 使用二维关联数组,是否允许覆盖已添加的观察者可以添加判断
      return $this->_observers[$type][]=$observer;
     }
     */
    
     /**
      * 删除一个注册了的观察者对象角色
      * @param Observer $observer
      * @return true/false
      */
      public function detach(SplObserver $observer)
      {
       $index=array_search($observer, $this->_observers);
       if($index===false || !array_key_exists($index, $this->_observers))
       {
        return false;
       }
       unset($this->_observers[$index]);
       return true;
      }
      /**
       * 通知注册的观察者
       */
      public function notify()
      {
       if(is_array($this->_obeservers))
       {
        return false;
       }
       
       foreach ($this->_observers as $observer) {
            $observer->update($this);
        }
        return true;      
      }
     
      /*
       *  public function notify()
       *  {
       *    //分类观察者 
       *    foreach ($this->_observers[$type] as $observer)
       *    {
       *        $observer->update($this);
       *    }
       *  }
       * 
       */
     
      /**
       * 当这个状态发生改变 调用notify();
       */
      public function setvalue($value)
      {
          $this->value = $value;
           $this->notify();     
      }
     
      public function getValue()
   {
        return $this->value;
   }
     
}

/**
 * 具体观察者对象角色1,继承PHP的SPL接口
 */
class Observer1 implements SplObserver
{
       public function update(SplSubject $subject)
       {
           echo 'one comeing '.$subject->getValue();
       }   

}

/**
 * 具体观察者对象角色2,继承PHP的SPL接口
 */
class Observer2 implements SplObserver
{
       public function update(SplSubject $subject)
       {
           echo '<br> two comeing '.$subject->getValue();
       }   

}

//定义被观察者
$subject   = new ConcreteSubject();
//观察者1
$observer1 = new Observer1();
//观察者2
$observer2 = new Observer2();
//注册新的观察者
$subject->attach($observer1);
$subject->attach($observer2);
//来新周刊了通知注册了的观察者
$subject->setValue("weekly magazine");

/*
 * 注:如果观察需要分类,可以使用一个二维关联数组来当作观察者容器,关键的实现我上面有部分代码,其他需要读者去完善。
 */

  评论这张
 
阅读(102)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018