当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
一个对象对其他依赖的对象的解耦。一般会配合消息队列异步运行,
class Event
{
function trigger()
{
echo "Event update!<br/>";
echo "update1<br/>";
echo "update2<br/>";
// ...
}
}
//使用
$event = new Event;
$event->triger();
以前我们会这样写一对多的一个依赖关系。
现在我们改进一下:
abstract class EventGenerator
{
private $arrObserver = array();
function addObserver(Observer $observer)
{
$this->arrObserver[] = $observer;
}
function notify()
{
foreach ($this->arrObserver as $observer){
$observer->index();
}
}
}
我们新建一个事件发生器的一个抽象基类。
interface Observer
{
function index();
}
声明一个观察者的接口
class Observer1 implements Observer{
function index()
{
echo "observer1<b>";
}
}
class Observer2 implements Observer{
function index()
{
echo "observer2<b>";
}
}
然后我们编写事件,继承是事件生成器
class Event extends EventGenerator
{
function trigger()
{
echo "Event<br>";
$this->notify();
}
}
使用:
$event = new Event();
$event->addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->trigger();
当我们实例化了事件类,将观察者1和观察者2添加到event的arrObserver数组中管理。
当event触发了notify函数后,遍历arrObserver数组,并且执行约束的Observer接口方法。就实现了观察者模式。