意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
主要解决:
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
何时使用:
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
个人理解:
就像订阅公众号一样,公众号发布一条推送,所有订阅者就都能接收到。
<?php
/**
* 事件产生类
*
* Class EventGenerator
*/
abstract class EventGenerator
{
private $ObServers = []; // 初始化一个数组
/**
* 增加观察者
*
* @param ObServer $ObServer
*/
public function add(ObServer $ObServer) // 这里是第2步调用的
{
$this->ObServers[] = $ObServer; // 注意,这里是把多次增加的观察者类添加进了一个数组
}
/**
* 事件通知
*/
public function notify()
{
foreach ($this->ObServers as $ObServer) { // 通过第3步调用,遍历第2步的数组
$ObServer->update(); // 调用管擦者类自身的update方法
}
}
}
/**
* 观察者接口类
*
* Interface ObServer
*/
interface ObServer
{
public function update($event_info = null);
}
/**
* 观察者1
*/
class ObServer1 implements ObServer
{
public function update($event_info = null)
{
echo '观察者1<br>';
}
}
/**
* 观察者2
*/
class ObServer2 implements ObServer
{
public function update($event_info = null)
{
echo '观察者2<br>';
}
}
/**
* 事件
*
* Class Event
*/
class Event extends EventGenerator
{
/**
* 触发事件
*/
public function trigger()
{
$this->notify(); // 通知观察者
}
}
$event = new Event(); // 1.创建一个事件
$event->add(new ObServer1()); // 2.1.添加观察者
$event->add(new ObServer2()); // 2.2.添加观察者
$event->trigger(); // 3.通知观察者