<?php
/**
* 观察者模式
* 通常来说,三要素
* 1.被观察者(目标)
* 2.事件对象(参数)
* 3.观察者(处理事件)
*/
interface ITarget{
public function notify(Param $param);
}
interface IObserve{
public function update(Param $param);
}
/**
* 目标类
* Class Target
*/
class Target implements ITarget{
protected $observe_list = [];
public function run(){
//用户注册逻辑处理...省略
$this->notify(new Param(1));
}
public function addObserve(IObserve $observe){
$this->observe_list[] = $observe;
}
public function notify(Param $param){
foreach ($this->observe_list as $observe){
$observe->update($param);
}
}
}
//事件对象
class Param{
public $register_status = 0;
public function __construct($register_status)
{
$this->register_status = 1;
}
}
//观察者
class ObserveEmail implements IObserve{
public function update(Param $param){
if($param->register_status == 1){
echo '邮件通知用户注册成功'.'<br/>';
}
}
}
class ObservePhone implements IObserve{
public function update(Param $param){
if($param->register_status == 1){
echo '电话通知用户注册成功'.'<br/>';
}
}
}
class ObserveMessage implements IObserve{
public function update(Param $param){
if($param->register_status == 1){
echo '站内信息通知用户注册成功'.'<br/>';
}
}
}
/**
* 观察者的优点:
* 1.将数据和处理分层
* 2.可以做广播
* 3.处理者不需要了解目标的变化过程,解耦
*/
/**
* 观察者缺点:
* 1.如果观察者过多,通知是耗费时间的
* 2.当观察者和目标之间存在循环依赖,有可能死循环
* 3.处理者只知道目标变动了,单不知道目标怎么变动的
*/
$target = new Target();
$target->addObserve(new ObserveEmail());
$target->addObserve(new ObservePhone());
$target->addObserve(new ObserveMessage());
$target->run();