观察者模式

时间:2019-10-07 11:07:49   收藏:0   阅读:59

模式定义

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

观察者模式的核心在于Subject和Observer接口,Subject(主题目标)包含一个给定的状态,观察者“订阅”这个主题,将主题的当前状态通知观察者,每次给定状态改变时所有观察者都会得到通知。

发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。

在PHP的标准库(SPL)里甚至提供了三个接口SplSubjectSplObserverSplObjectStorage来让开发者更容易地实现观察者模式。

模式结构说明

技术分享图片

何时使用观察者模式

应用举例

<?php

class Subject implements SplSubject
{
    private $observers = [];
    private $stateNow;

    /**
     * Attach an SplObserver
     * @param SplObserver $observer
     */
    public function attach(SplObserver $observer)
    {
        // TODO: Implement attach() method.
        $this->observers[] = $observer;
    }

    /**
     * Detach an observer
     * @param SplObserver $observer
     */
    public function detach(SplObserver $observer)
    {
        // TODO: Implement detach() method.
        $key = array_search($observer, $this->observers);
        if ($key !== false) {
            unset($this->observers[$key]);
        }
    }

    /**
     * Notify an observer
     */
    public function notify()
    {
        // TODO: Implement notify() method.
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

    public function setState($state)
    {
        $this->stateNow = $state;
        $this->notify();
    }

    public function getState()
    {
        return $this->stateNow;
    }
}


class EmailObserver implements SplObserver
{
    /**
     * Receive update from subject
     * @param SplSubject $subject
     */
    public function update(SplSubject $subject)
    {
        // TODO: Implement update() method.
        echo $subject->getState() . ‘,发送邮件‘ . PHP_EOL;
    }
}

class SmsObserver implements SplObserver
{
    /**
     * Receive update from subject
     * @param SplSubject $subject
     */
    public function update(SplSubject $subject)
    {
        // TODO: Implement update() method.
        echo $subject->getState() . ‘,发送短信‘ . PHP_EOL;
    }
}

// run
$emailObserver = new EmailObserver();
$smsObserver = new SmsObserver();

$subject = new Subject();
$subject->attach($emailObserver);
$subject->attach($smsObserver);
$subject->setState(‘用户修改密码‘);

 

参考:https://github.com/kevinyan815/Learning_Laravel_Kernel/blob/master/articles/Observer.md

原文:https://www.cnblogs.com/cshaptx4869/p/11629715.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!