文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-20 12:57

关注

本篇内容主要讲解“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()操作

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

完整代码: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();

说明

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

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯