![observer observer](http://www.smartwei.com/wp-content/uploads/2010/04/observer.gif)
这篇文章介绍一下设计模式中的观察者模式。 观察者模式应用到php面向对象编程中,可以避免组件之间紧密耦合。另外的关于如何避免组件之间机密耦合的方法,可以参考php面向对象编程 – 使用接口实现松散耦合这篇文章。
观察者模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。
一个简单示例是系统中的用户列表。下面的代码显示一个用户列表,添加用户时,它将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。
04 | function onChanged( $sender , $args ); |
09 | function addObserver( $observer ); |
12 | class UserList implements IObservable |
14 | private $_observers = array (); |
16 | public function addCustomer( $name ) |
18 | foreach ( $this ->_observers as $obs ) |
19 | $obs ->onChanged( $this , $name ); |
22 | public function addObserver( $observer ) |
24 | $this ->_observers []= $observer ; |
28 | class UserListLogger implements IObserver |
30 | public function onChanged( $sender , $args ) |
32 | echo ( "'$args' added to user list/n" ); |
37 | $ul ->addObserver( new UserListLogger() ); |
38 | $ul ->addCustomer( "Jack" ); |
此代码定义四个元素:两个接口和两个类。IObservable 接口定义可以被观察的对象,UserList 实现该接口,以便将本身注册为可观察。IObserver 列表定义要通过怎样的方法才能成为观察者,UserListLogger 实现 IObserver 接口。
如果在命令行中运行它,您将看到以下输出:
2 | 'Jack' added to user list |
测试代码创建 UserList,并将 UserListLogger 观察者添加到其中。然后添加一个消费者,并将这一更改通知 UserListLogger。
认识到 UserList 不知道日志程序将执行什么操作很关键。可能存在一个或多个执行其他操作的侦听程序。例如,您可能有一个向新用户发送消息的观察者,欢迎新用户使用该系统。这种方法的价值在于 UserList 忽略所有依赖它的对象,它主要关注在列表更改时维护用户列表并发送消息这一工作。
此模式不限于内存中的对象。它是在较大的应用程序中使用的数据库驱动的消息查询系统的基础。
作者: 石巍
原载: 五种常见的 PHP 设计模式
版权所有,转载时必须以超链接形式注明作者和原始出处及本声明。