zoukankan      html  css  js  c++  java
  • 设计模式-观察者模式(observer)

        设计模式-观察者模式(observer)

    1、概念:观察者模式又叫发布-订阅(Publish/Subscribe)模式。只要被观察者作出了响应的改变,观察者们就会有相应的动作

    2、特点:

    1)对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变

    2)对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节 

    3、场景: 

    1)订单支付成功后,会做各种动作,比如发送EMAIL,或者改变订单状态,发送短信给客户,修改优惠券,通知仓库订单号等等
    2)网站登录之后,修改登录时间,推送最新活动,让附近的人给他打招呼

    4、在观察者模式中,又分为推模型和拉模型两种方式

    1)推模型是假定主题对象知道观察者需要的数据

    2)拉模型是主题对象不知道观察者具体需要什么数据,没有办法的情况下,干脆把自身传递给观察者,让观察者自己去按需要取值。

    两种方式的比较:推模型可能会使得观察者对象难以复用,因为观察者的update()方法是按需要定义的参数,可能无法兼顾没有考虑到的使用情况。这就意味着出现新情况的时候,就可能提供新的update()方法,或者是干脆重新实现观察者;而拉模型就不会造成这样的情况,因为拉模型下,update()方法的参数是主题对象本身,这基本上是主题对象能传递的最大数据集合了,基本上可以适应各种情况的需要

    5、PHP官方提供的实现方式

    php提供的两个接口,一个被观察者接口SplSubject,一个或多个观察者接口SplObserver,和一个可以储存对象的类SplObjectStorage。

    1)被观察者接口SplSubject有三个方法,需要实现这三个方法,一个attach可以理解为添加一个观察者,detach可以理解为删除掉一个观察者,notify里面,循环执行观察者的update方法(被观察者被存储在splobjectstorage类里面),update方法把本类作为参数传进去。

    2)观察者接口SplObserver中的update()方法对于观察者模式至关重要,因为它会得到Subject状态的最新变化,并交给观察者实例。

    3)SplObjectStorage类与观察者设计模式没有内在的关系,不过通过它可以很方便地将观察者实例与一个主题实例相关联以及解除关联。

          SplObjectStorage对象用来存储观察者对象,这样就省去了底层数组的很多操作细节,比如in_array判断观察者对象是否已经存在了,这是一种委托设计模式。

    4)demo代码如下:

    Aticle.php

    主题(被观察者)

    观察者

    测试结果:

    参考链接:

    https://segmentfault.com/a/1190000008803247

    https://blog.csdn.net/sinat_34093604/article/details/53081130

  • 相关阅读:
    centos ppp拨号
    Xen、KVM和VirtualBox比拼
    static用法一
    linux浏览器,邮件客户端,输入法,双屏设置,应用软件,gnome-screenshot/scrot -s截图,office
    OpenGl学习总结
    DICOM医学图像处理:DCMTK在VS2012中的配置
    linux下用mail发送邮件
    (HLS播放器之中的一个)HLS协议之M3U8解析
    tcpdump抓包分析具体解释
    对账简单说
  • 原文地址:https://www.cnblogs.com/hld123/p/12980402.html
Copyright © 2011-2022 走看看