PHP面向对象深入理解之四(设计模式-观察者模式)

观察者模式对于PHP而言,有几个内置的接口实现,相关的模式,分别是 SplSubject

SubObserverSplObjectStoarge,相比uml类图,我比较喜欢用更通俗易懂的关系图解释现象,如下图。



被观察者  通过映射对象 存储了所有的 观察者对应的对象映射,然后在被观察者发生改变的时候,会循环映射对像,通知所有的观察者

,直接上代码。

主体(被观察者)类:

/**
 * @package: 观察者模式
 * 所谓的观察者,通俗一点讲
   主体 (被观察者 A)    SplSubject
   存储容器 (观察者映射表) SplObjectStorage
   观察者 B1,B2,B3...  SplObserver
   A一段发生改变,B1,B2,B3... 都会收到相应的通知
 */
//------------主体 被观察者
class Subject implements SplSubject
{
    private $observers;
    private $data;

    public function setStorage()
    {
        $this->observers = new SplObjectStorage();
    }

    public function attach(SplObserver $observer)
    {
        $this->observers->attach($observer);
    }

    public function detach(SplObserver $observer)
    {
        $this->observers->detach($observer);
    }

    public function notify()
    {
        foreach($this->observers as $observer){
            $observer->update($this);
        }
    }

    public function setData($data)
    {
        $this->data = $data;
    }

    public function getData()
    {
        return $this->data;
    }
}


观察者:

//---------------观察者 
//---------也就是说 每一个观察者 只要实现 SplObserver 并实现方法update 就能被通知到
class Observer implements SplObserver
{
    private $name = '';
    public function __construct($name)
    {
        $this->name = $name;
    }
    public function update(SplSubject $subject)
    {
        echo $this->name.":";
        var_dump($subject->getData());
    }
}


调用:

// 实例使用

$A = new Subject();
$A->setStorage();
$B1 = new Observer('B1');
$B2 = new Observer('B2');
$B3 = new Observer('B3');
$A->attach($B1);
$A->attach($B2);
$A->attach($B3);
$A->setData('123');
$A->notify();
$A->detach($B2);
$A->setData('456');
$A->notify();


调用结果:

B1:string(3) "123"
B2:string(3) "123"
B3:string(3) "123"
B1:string(3) "456"
B3:string(3) "456"


可以看到每个存在于映射对象里的对象都收到了相应的通知。其实具体的思路,我们不应该仅仅局限于

php所给的SplObjectStorage 存储,我们可以扩展到redis 及其他,SplSubject 和 SplObserver 也是,只要

实现 被观察者 能获取每一个观察者,并能调用相应的观察者通知方法,有点类似消息队列的定时推送,

















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值