观察者模式(Observer Pattern):
观察者模式必须包含两个角色:观察者(Observer)和被观察对象(Observable)。观察者和被观察者之间存在“观察”的逻辑关系。当被观察着发生改变时,观察者就会观察到这样的变化,并作出相应的相应。观察者模式完美地将观察者和被观察者的对象分离开。
观察者模式的实现通常是一个对象通过添加一个方法使本身变得可观察(Observable)。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者(Observer)使用该信息执行的操作与可观察的对象(Observable)无关。
下面以系统中的用户列表为例,当新添加用户时,用户列表记录器(观察者)可以观察此列表(被观察者),代码如下:
<?php
interface IObserver { function onChanged($sender, $args); } interface IObservable {
function addObserver($observer); } class UserList implements IObservable {
private $_observers = array(); function addObserver($observer) { $this->_observers[] = $observer; } function addUser($name) { foreach($this->_observers as $obj) { $obj->onChanged($this, $name); } } function __toString() { return "UserList"; } } // 只使用一个UserListLogger实例进行观察
class UserListLogger implements IObserver { private static $instance = null; private function __construct() {} public static function getInstance() { if(self::$instance == null) { self::$instance = new UserListLogger(); } return self::$instance; } function onChanged($sender, $args) { echo $args . "被添加到用户列表" . $sender . "中<br>"; } } $ul = new UserList();
$ul->addObserver(UserListLogger::getInstance()); $ul->addUser("赵二"); $ul->addUser("张三"); $ul2 = new UserList();
$ul2->addObserver(UserListLogger::getInstance()); $ul2->addUser("李四"); $ul->addUser("王五");
?> 观察者模式的类关系图:
![]() 观察者模式的运行结果:
![]() |
|