更好的构造开发模板 五种PHP设计模式3

时间:2010-01-16 10:37:59   来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。 一个简单示例是系统中的用户列表。清单 4 中的代码显示一个用户列表,添加用户时,它将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。        清单 4. Observer.php     &n...
  正文:

观察者模式
  
    观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。 一个简单示例是系统中的用户列表。清单 4 中的代码显示一个用户列表,添加用户时,它将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。
  
    清单 4. Observer.PHP
  
  <?php
  interface IObserver
  {
   function onChanged( $sender, $args );
  }
  
  interface IObservable
  {
   function addObserver( $observer );
  }
  
  class UserList implements IObservable
  {
   private $_observers = array();
  
   public function addCustomer( $name )
   {
    foreach( $this->_observers as $obs )
    $obs->onChanged( $this, $name );
   }
  
   public function addObserver( $observer )
   {
    $this->_observers []= $observer;
   }
  }
  
  class UserListLogger implements IObserver
  {
   public function onChanged( $sender, $args )
   {
    echo( "'$args' added to user listn" );
   }
  }
  
  $ul = new UserList();
  $ul->addObserver( new UserListLogger() );
  $ul->addCustomer( "Jack" );
  ?>
  
    此代码定义四个元素:两个接口和两个类。IObservable 接口定义可以被观察的对象,UserList 实现该接口,以便将本身注册为可观察。IObserver 列表定义要通过怎样的方法才能成为观察者,UserListLogger 实现 IObserver 接口。图 4 的 UML 中展示了这些元素。
  
  图 4. 可观察的用户列表和用户列表事件日志程序
  
    如果在命令行中运行它,您将看到以下输出:
  
  % php observer.php
  'Jack' added to user list
  %
  
    测试代码创建 UserList,并将 UserListLogger 观察者添加到其中。然后添加一个消费者,并将这一更改通知 UserListLogger。
  
    认识到 UserList 不知道日志程序将执行什么操作很关键。可能存在一个或多个执行其他操作的侦听程序。例如,您可能有一个向新用户发送消息的观察者,欢迎新用户使用该系统。这种方法的价值在于 UserList 忽略所有依赖它的对象,它主要关注在列表更改时维护用户列表并发送消息这一工作。
  
    此模式不限于内存中的对象。它是在较大的应用程序中使用的数据库驱动的消息查询系统的基础。


来源:http://www.002pc.com/master/College/Programming/PHP/11952.html

收藏到:

关于《更好的构造开发模板 五种PHP设计模式3》文章的评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面

随机文章

    SQL Error: select * from ***_ecms_article where classid='86' and checked=1 order by rand() limit 10

顶出来的热门

    SQL Error: select * from ***_ecms_article where classid='86' and checked=1 order by diggtop desc,id desc limit 10
站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td