观察者模式定义了一种一对多的依赖关系,让多个观察者对象监听某一个主题对象,当主题对象状态发生改变的时候,会通知观察者对象,观察者自动更新自己。

主题对象抽象类(即通知者抽象类):

abstract class Subject {

private $observers = array ();

public function addObserver(Observer $observer)
{
    $this->observers[] = $observer;
}

public function detachObserver(Observer $observer)
{
    $key = array_search($observer, $this->observers);
    unset($this->observers[$key]);
}

public function notify()
{
    foreach ($this->observers as $o) {
        $o->update();
    }
}
}

观察者接口类(Observer.php):

interface Observer {

public function update();
}

具体观察者类:

class Observer1 implements Observer {

public function update()
{
    echo 'My is 1';
}
}

class Observer2 implements Observer {

public function update()
{
    echo 'My is 2';
}
}

具体通知者类:

class ConcreteSubject extends Subject {

}

客户端代码:

$sub = new ConcreteSubject();
$observer1 = new Observer1();
$observer2 = new Observer2();
$sub->addObserver($observer1);
$sub->addObserver($observer2);
$sub->notify();

结果:

My is 1My is 2

当一个对象的改变需要同时去改变其他对象,而且不知道需要通知多少个对象的时候可以考虑使用观察者模式。观察者模式的主要作用就是解除耦合。让双方都依赖于抽象,其中一方改变不影响另一方。