观察者模式
定义了一种一对多的依赖关系,让多个观察者对象监听某一个主题对象,当主题对象状态发生改变的时候,会通知观察者对象,观察者自动更新自己。
主题对象抽象类(即通知者抽象类):
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
当一个对象的改变需要同时去改变其他对象,而且不知道需要通知多少个对象的时候可以考虑使用观察者模式。观察者模式的主要作用就是解除耦合。让双方都依赖于抽象,其中一方改变不影响另一方。