// 观察者接口
interface Observer{
public function send($event_info = null);
}
// 发送邮件观察者
class SendEmail implements Observer{
// 邮件发送地址
private $emailUrl = null;
public function __construct($emailUrl){
$this->emailUrl = $emailUrl;
}
public function send($event_info = null){
echo '内容-'.$event_info.'-件已发送--'.$this->emailUrl. PHP_EOL;
}
}
// 发送短信观察者
class SendMessage implements Observer{
// 短信发送地址
private $phoneUrl = null;
public function __construct($phoneUrl){
$this->phoneUrl = $phoneUrl;
}
public function send($event_info = null){
echo '内容-'.$event_info.'-短信已发送'.$this->phoneUrl. PHP_EOL;
}
}
// 事件
class Event{
// 观察者数组
private $observers = [];
// 发送的内容
private $event_info = null;
// 添加观察者
public function addObserver(Observer $observer){
$this->observers[] = $observer;
}
// 设置事件
public function setEventInfo($event_info){
$this->event_info = $event_info;
}
// 循环通知观察者
public function notify(){
foreach($this->observers as $observer){
$observer->send($this->event_info);
}
}
}
// 测试
$event = new Event();
$event->addObserver(new SendEmail('773428283'));
$event->addObserver(new SendMessage('13306434378'));
$event->setEventInfo('你好,恭喜你注册成功');
$event->notify();
* 观察者模式
* 1. 一个对象状态改变,所有依赖于它的对象都会得到通知
* 2. 一个对象被修改,会自动通知它的依赖对象
*
* 优点:
* 1. 观察者和被观察者是抽象耦合的
* 2. 建立一套触发机制
*
* 缺点:
* 1. 如果一个被观察者对象有很多直接和间接的观察者的话,将所有观察者都通知到会花费很多时间
* 2. 如果在观察者和被观察者之间有循环依赖的话,可能会导致系统崩溃
* 3. 观察者模式没有相应的机制让观察者知道所观察的对象是怎么发生变化的,而仅仅只是知道观察的对象发生了变化
*
* 适用场景:
* 1. 关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系
* 2. 事件多级触发场景
* 3. 跨系统的消息交换场景,如消息队列的处理机制