zoukankan      html  css  js  c++  java
  • PHP 设计模式之观察者模式

    简单描述

    观察者模式(Observer)是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

    当对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。它使用的是低耦合的方式。

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    观察者模式UML图

    使用场景

    支付场景

    支付场景下,用户购买一件商品,当支付成功之后三方会回调自身,在这个时候系统可能会有很多需要执行的逻辑(如:更新订单状态,发送邮件通知,赠送礼品…),这些逻辑之间并没有强耦合,因此天然适合使用观察者模式去实现这些功能,当有更多的操作时,只需要添加新的观察者就能实现,完美实现了对修改关闭,对扩展开放的开闭原则。

    订阅功能,例如微博的订阅

    当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。

    实例

    PHP 已经定义了 2 个接口用于快速实现观察者模式:SplObserver 和 SplSubject

    下面以订单为例:当状态变化,需要进行相关处理,例如写日志、短信通知。

    <?php
    // 实现PHP 自带的 SplObserver 抽象接口
    class LogObserver implements SplObserver
    {
        public function update($data)
        {
            echo 'write log to file.' . "<br>";
        }
    }
    // 实现PHP 自带的 SplObserver 抽象接口
    class SmsObserver implements SplObserver
    {
        public function update($data)
        {
            echo 'send sms' . "<br>";
        }
    }
    
    class OrderSubject implements SplSubject
    {
        public   $data;
        private  $observers = []; //观察者集合
    
        public function attach(SplObserver $observer)
        {
            array_push($this->observers, $observer);
        }
    
        public function detach(SplObserver $observer)
        {
            return false;
        }
    
        public function notify()
        {
            if(count($this->observers) == 0) return false;
            foreach ($this->observers as $observer)
            {
                $observer->update($this);
            }
        }
    
        public function change($data)
        {
            // 假设订单数据正确,这部分的逻辑可以根据真实场景进行随意更改,我这里只是简单示范
            if ($data['oid'] == 1 && $data['flag'] == 3) 
            {
                $this->data = $data;
                $this->notify();
            }
        }
    
    }
    
    $order_subject = new OrderSubject();
    $order_subject->attach(new LogObserver());//写日志
    $order_subject->attach(new SmsObserver());//发短信
    $order_subject->change(['oid' => '1', 'flag' => 3]); //订单状态变化,触发观察者

    输出结果:
    write log to file.
    send sms

    原文地址:https://www.ryanzoe.top/%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f/php-observer-mode/

  • 相关阅读:
    git学习
    小程序强制自动更新
    UI设计规范
    2019前端面试题汇总(vue)
    技术面试笔试题
    阿里云万网虚拟主机安装配置Https(SSL)教程
    [转]Vue项目全局配置微信分享思路详解
    Elasticsearch学习笔记之—分词器 analyzer
    合成图片+合成文字+图片
    C# 在Bitmap上绘制文字出现锯齿的问题
  • 原文地址:https://www.cnblogs.com/ryanzheng/p/12783065.html
Copyright © 2011-2022 走看看