加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

PHP设计模式三(观察者设计模式)

(2013-03-20 10:01:03)
标签:

php设计模式

观察者

it

分类: php那些事
观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象 通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观 察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观 察的对象无关。结果是对象可以相互对话,而不必了解原因。
一个简单示例是系统中的用户列表。清单 中的代码显示一个用户列表,添加用户时,它 将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。

<?php
     interface IObserver
     {
          function onChanged($send,$name);
     }

     interface Observerable
     {
          function addObserverable($observer);
     }
    
     class UserList implements Observerable
     {
          private $_observer = array();
         
          public function addObserverable($observer)
          {
               $this->_observer[] = $observer;
          }
          public function addUser($name)
          {
               foreach($this->_observer as $obj)
               $obj->onChanged($this,$name);
          }
     }
     class UserListLog implements IObserver
     {
          public function onChanged($send,$name)
          {
               echo "user :{$name} is add to log ...<br />";
          }
     }
     $o = new UserList();
     $o->addObserverable(new UserListLog());
     $o->addUser("braveryhui");
     $o->addUser("braveryhui1");
     $o->addUser("braveryhui2");
输出
user :braveryhui is add to log ...
      user :braveryhui1 is add to log ...
      user :braveryhui2 is add to log ...


此代码定义四个元素:两个接口和两个类。IObservable 接口定义可以被观察的对象, UserList 实现该接口,以便将本身注册为可观察。IObserver 列表定义要通过怎样的方法才能成 为观察者,UserListLogger 实现 IObserver 接口。图 4  UML 中展示了这些元素。


 4. 可观察的用户列表和用户列表事件日志程序
page7image5960

测试代码创建 UserList,并将 UserListLogger 观察者添加到其中。然后添加一个消费者, 并将这一更改通知 UserListLogger

认识到 UserList 不知道日志程序将执行什么操作很关键。可能存在一个或多个执行其他操 作的侦听程序。例如,您可能有一个向新用户发送消息的观察者,欢迎新用户使用该系统。这种 方法的价值在于 UserList 忽略所有依赖它的对象,它主要关注在列表更改时维护用户列表并发 送消息这一工作。

  此模式不限于内存中的对象。它是在较大的应用程序中使用的数据库驱动的消息查询系统 
的基础。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有