我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP中的观察者模式是什么意思

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHP中的观察者模式是什么意思

本篇内容主要讲解“PHP中的观察者模式是什么意思”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP中的观察者模式是什么意思”吧!

观察者,貌似在很多科幻作品中都会有这个角色的出现。比如我很喜欢的一部美剧《危机边缘》,在这个剧集中,观察者不停的穿越时空记录着各种各样的人或事。但是,设计模式中的观察者可不只是站在边上看哦,这里的观察者是针对主体发生的状态改变来做出对应的动作。

Gof类图及解释

GoF定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

GoF类图:

PHP中的观察者模式是什么意思

代码实现

interface Observer{    public function update(Subject $subject): void;}

观察者的抽象接口,没啥可说的吧,就是让你实现一个具体的Update就可以了

class ConcreteObserver implements Observer{    private $observerState = '';    function update(Subject $subject): void    {        $this->observerState = $subject->getState();        echo '执行观察者操作!当前状态:' . $this->observerState;    }}

具体的观察者,实现update()方法,这里我们拿到了Subject类,从而可以获得其中的状态

class Subject{    private $observers = [];    private $stateNow = '';    public function attach(Observer $observer): void    {        array_push($this->observers, $observer);    }    public function detach(Observer $observer): void    {        $position = 0;        foreach ($this->observers as $ob) {            if ($ob == $observer) {                array_splice($this->observers, ($position), 1);            }            ++$position;        }    }    public function notify(): void    {        foreach ($this->observers as $ob) {            $ob->update($this);        }    }}

Subject父类,维护一个观察者数组,然后有添加、删除以及循环遍历这个数组的方法,目的是能够方便的管理所有的观察者

class ConcreteSubject extends Subject{    public function setState($state)    {        $this->stateNow = $state;        $this->notify();    }    public function getState()    {        return $this->stateNow;    }}

Subject的实现类,只是更新了状态,在这个状态发生改变的时候,调用观察者遍历的方法进行所有观察的update()操作

  • 观察者,其实就是自身做了一个更新(update),而Subject,可以批量的执行观察者,请注意,我们不需要去修改目标类中的任何代码,只需要从外部添加就可以了,所以就让目标和观察者解耦互相之间不用关心对方的情况了

  • 观察者可以记录目标的状态,也可以不用记录,比如我们发完短信后的数据库更新或者插入操作,只有短信接口发送成功后我们再修改短信数据的状态就可以了,不一定完全需要将目标的发送状态传送给观察者

  • 当一个类在发生改变时,不知道可能会对其他多少类产生影响,这个时候观察者非常有用

  • 观察者模式中还是存在着耦合,那就是目标类中有一个观察者对象列表,如果观察者没有实现update()方法,那么就会出现问题

接着拿我们的手机工厂说事儿,这次好嘛,被一帮山寨机盯上了(观察者),我出什么功能(状态更新),他们就对应的出一样的功能(更新),而且还在我的基础上做了更多的东西,美其名曰:微创新!你说气人不气人。好吧,我也派出了一帮市场调查人员(观察者),去帮我观察别人家的手机都出了什么功能(状态更新),然后我们也照搬过来搞点微创新,大家共同进步嘛!!

完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/06.observer/source/observer.php

实例

这次我们从订单说起,不过还是有短信发送的事儿。当一般的电商平台有人下单之后,需要做的事情非常多,比如修改库存、发送短信或者推送告诉商家有人下单了,告诉买家下单成功了,支付成功了。总之就是一件事情的发生会导致各种事件的产生。其实,这里就引出了另一个非常出名的模式订阅发布模式。这个模式可以说是观察者的升级模式,这个系列的文章不会细讲,但是大家可以去看看Laravel中的发布订阅事件监听方面的内容。

订单售出类图

PHP中的观察者模式是什么意思

完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/06.observer/source/order-observer.php

interface Observer{    public function update($obj);}class Message implements Observer{    //....    function update($obj)    {        echo '发送新订单短信(' . $obj->mobile . ')通知给商家!';    }    //....}class Goods implements Observer{    //....    public function update($obj)    {        echo '修改商品' . $obj->goodsId . '的库存!';    }    //....}class Order{    private $observers = [];    public function attach($ob)    {        $this->observers[] = $ob;    }    public function detach($ob)    {        $position = 0;        foreach ($this->observers as $ob) {            if ($ob == $observer) {                array_splice($this->observers, ($position), 1);            }            ++$position;        }    }    public function notify($obj)    {        foreach ($this->observers as $ob) {            $ob->update($obj);        }    }    public function sale()    {        // 商品卖掉了        // ....        $obj = new stdClass();        $obj->mobile = '13888888888';        $obj->goodsId = 'Order11111111';        $this->notify($obj);    }}$message = new Message();$goods = new Goods();$order = new Order();$order->attach($message);$order->attach($goods);// 订单卖出了!!$order->sale();

说明

  • 我们没有完全的遵守GoF类图,虽说GoF是圣经,但也并不是我们必须要完全遵守的,我们可以针对具体的业务情况进行合适的裁剪使用

  • 订单状态通过sale()方法产生变化后,直接调用notify方法进行观察者的调用

  • 发短信、发推送都可以拆开由一个一个的观察者来实现,这些观察者不一定只有这一个方法,但只要实现共同的接口就可以了

  • 商品库存和消息发送其实就是两个本身完全不沾边的类,但它们只需要实现一样的接口就好啦

  • PHP的SPL扩展中已经为我们准备好了一套观察者接口,大家可以试试哦,使用原生支持的观察者模式能省不少事儿呢!

到此,相信大家对“PHP中的观察者模式是什么意思”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHP中的观察者模式是什么意思

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP中的观察者模式是什么意思

本篇内容主要讲解“PHP中的观察者模式是什么意思”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP中的观察者模式是什么意思”吧!观察者,貌似在很多科幻作品中都会有这个角色的出现。比如我很喜欢的
2023-06-20

PHP中的观察者模式是什么

这篇文章主要讲解了“PHP中的观察者模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的观察者模式是什么”吧!介绍现在有两派,有的人建议使用设计模式,有的人不建议使用设计模式!
2023-06-20

java观察者模式是什么

本篇内容介绍了“java观察者模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!观察者模式① 观察者模式的概念观察者模式(Observ
2023-06-19

Java编程中的观察者模式是什么

这篇文章主要介绍“Java编程中的观察者模式是什么”,在日常操作中,相信很多人在Java编程中的观察者模式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java编程中的观察者模式是什么”的疑惑有所帮助!
2023-05-30

PHP设计模式中观察者模式讲解

本文实例讲述了PHP设计模式之观察者模式定义与用法。分享给大家供大家参考,观察者模式当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新
2022-11-13

PHP设计模式中观察者模式详解

观察者模式是极其重要的一个设计模式,也是我几年开发过程中使用最多的设计模式,本文首先概述观察者模式的基本概念和Demo实现,接着是观察者模式在Java和Spring中的应用,最后是对观察者模式的应用场景和优缺点进行总结
2022-12-20

Android中实现观察者模式的原理是什么

这篇文章将为大家详细讲解有关Android中实现观察者模式的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。观察者模式:A类中定义一个被观察者画家package com.exampl
2023-05-31

Java观察者模式有什么用

这篇文章主要为大家展示了“Java观察者模式有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java观察者模式有什么用”这篇文章吧。一、观察者模式的定义和特点观察者模式的定义:指多个对象间
2023-06-22

PHP中的观察者模式如何工作?

php 中的观察者模式是一种设计模式,允许观察者订阅主题的状态变化并做出响应。当主题状态更改时,它会通知观察者,观察者可以相应地更新自己:主题类维护一个观察者列表并提供方法附加和删除观察者。主题类提供获取和设置状态的方法,当状态更改时触发观
PHP中的观察者模式如何工作?
2024-05-21

Java设计模式中的观察者模式

观察者模式定义对象之间的一种一对多的依赖关系,使得每当一个对象的状态发生变化时,其相关的依赖对象都可以得到通知并被自动更新。主要用于多个不同的对象对一个对象的某个方法会做出不同的反应
2023-02-16

Java观察者模式的实现方法是什么

Java观察者模式的实现方法如下:定义观察者接口(Observer):观察者接口定义了观察者对象的更新方法,通常包括一个update()方法来接收被观察者的通知。定义被观察者接口(Subject):被观察者接口定义了被观察者的行为,包括添加
2023-10-23

详解Java中的观察者模式

详解Java中的观察者模式?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更
2023-05-31

PHP设计模式之观察者模式怎么实现

这篇文章主要介绍“PHP设计模式之观察者模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP设计模式之观察者模式怎么实现”文章能帮助大家解决问题。PHP观察者模式(Observer Pa
2023-07-05

C#中的EventHandler观察者模式怎么实现

这篇文章主要介绍“C#中的EventHandler观察者模式怎么实现”,在日常操作中,相信很多人在C#中的EventHandler观察者模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中的Eve
2023-06-29

JavaScript设计模式中的观察者模式怎么实现

本文小编为大家详细介绍“JavaScript设计模式中的观察者模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript设计模式中的观察者模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
2023-07-02

PHP观察者模式的应用实例分析

本篇内容主要讲解“PHP观察者模式的应用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP观察者模式的应用实例分析”吧!PHP 观察者模式应用场景实例详解代码
2023-06-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录