美文网首页
观察者模式(Observer模式)

观察者模式(Observer模式)

作者: 苏康申 | 来源:发表于2020-02-16 14:48 被阅读0次

观察者模式

在PHP SPL中已经提供SplSubject和SqlOberver接口,源码如下:

// 主题 被观察者
interface SplSubject {
    public function attach(SplObserver $observer); //注册观察者到当前主题
    public function detach(SplObserver $observer); //从当前主题删除观察者
    public function notify(); //主题状态更新时通知所有的观察者做相应的处理
}

// 观察者
interface SplObserver {
    public function update(SplSubject $subject); //注册观察者到当前主题
}

-------------------------------------具体实现-------------------------------------
<?php
/**
 * 主题类(被观察者相当于一个主题,观察者订阅这个主题)
 * 当我们注册用户成功的时候想发送 email 和 sms 通知用户注册成功
 * 则 可以将 SendEmail 和 SendSms 作为观察者
 * 注册到 User 的观察者中
 * 当 User register 成功时 notify 给 observers
 * 各 observe 通过约定的 update 接口进行相应的处理 发邮件或发短信
 */
class User implements SplSubject
{
    public $name;
    public $email;
    public $mobile;

    /**
     * 当前主题下的观察者集合
     * @var array
     */
    private $observers = [];

    /**
     * 模拟注册
     * @param  [type] $name   [description]
     * @param  [type] $email  [description]
     * @param  [type] $mobile [description]
     * @return [type]         [description]
     */
    public function register($name, $email, $mobile)
    {
        $this->name   = $name;
        $this->email  = $email;
        $this->mobile = $mobile;

        //business handle and register success
        $reg_result = true;
        if ($reg_result) {
            $this->notify(); // 注册成功 所有的观察者将会收到此主题的通知
            return true;
        }

        return false;
    }

    /**
     * 当前主题注册新的观察者
     * @param  SplObserver $observer [description]
     * @return [type]                [description]
     */
    public function attach(SplObserver $observer)
    {
        return array_push($this->observers, $observer);
    }

    /**
     * 当前主题删除已注册的观察者
     * @param  SplObserver $observer [description]
     * @return [type]                [description]
     */
    public function detach(SplObserver $observer)
    {
        $key = array_search($observer, $this->observers, true);

        if (false !== $key) {
            unset($this->observers[$key]);
            return true;
        }

        return false;
    }

    /**
     * 状态更新 通知所有的观察者
     * @return [type] [description]
     */
    public function notify()
    {
        if (! empty($this->observers)) {
            foreach ($this->observers as $key => $observer) {
                $observer->update($this);
            }
        }

        return true;
    }

}


-------------------------------------Email/Sms 观察者-------------------------------------

/**
 * 观察者通过 update 来接受主题的更新通知
 */
class EmailObserver implements SplObserver
{
    /**
     * 观察者接收主题通知的接口
     * @param  SplSubject $user [description]
     * @return [type]           [description]
     */
    public function update(SplSubject $user)
    {
        echo "send email to " . $user->email . PHP_EOL;
    }
}

class SmsObserver implements SplObserver
{
    public function update(SplSubject $user)
    {
        echo "send sms to " . $user->mobile . PHP_EOL;
    }
}
-------------------------------------业务-------------------------------------
// User 主题
$user = new User();

// 为 user 注册 Email 观察者 (Email 观察者订阅 User 主题)
$emailObserver = new EmailObserver();
$user->attach($emailObserver);

// 为 user 注册 Sms 观察者 (Sms 观察者订阅 User 主题)
$smsObserver = new SmsObserver();
$user->attach($smsObserver);

// 从 user 上删除 Sms 观察者 (Sms 观察者取消订阅 User 主题)
//$user->detach($smsObserver);

// register 中会根据注册结果通知观察者 观察者做相应的处理
$user->register("big cat", "32448732@qq.com", "1888888888");

-------------------------------------结果-------------------------------------

send email to 1226432372@qq.com
send sms to 1888888888
[Finished in 0.1s]

相关文章

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • 设计模式之观察者模式

    观察者模式 Observer Intro 观察者模式又叫做 发布订阅(Publish/Subscribe)模式,观...

  • 行为型模式——观察者模式

    观察者模式定义 观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象...

  • c++观察者模式

    1.观察者模式简介    观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe)...

  • Android 常见的六大设计模式

    观察者模式 适配器模式 代理模式 工厂模式 单例模式 命令模式 1.观察者模式(Observer Pattern)...

  • 设计模式之观察者模式

    观察者模式定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/Subscrib...

  • Observer模式

    观察者模式(Observer模式) 定义 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subs...

  • 面試小記

    1:设计模式 观察者模式observer observerble,subscribe (订阅) (1)观察者对象 ...

  • 设计模式——观察者模式

    观察者模式的定义 观察者模式(Observer Pattern)也叫发布订阅模式(Publish/subscrib...

  • Android多进程观察者模式

    1.观察者模式简介 观察者模式(Observer)又叫做发布-订阅模式(Publish/Subscribe),定义...

网友评论

      本文标题:观察者模式(Observer模式)

      本文链接:https://www.haomeiwen.com/subject/rxvpfhtx.html