技术开发 频道

五种常见的PHP设计模式

  观察者模式

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

  一个简单示例是系统中的用户列表。清单 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 list\n" );
  }
}

$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 忽略所有依赖它的对象,它主要关注在列表更改时维护用户列表并发送消息这一工作。

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

0
相关文章