观察者模式

<?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();

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值