zoukankan      html  css  js  c++  java
  • 观察者模式中,消息采用推和拉方式来传递的比较

    观察者模式中,消息采用推和拉方式来传递的比较

    观察者模式,指的是定义一种对象间的一对多的关系,当一个对象的状态发生变化的时候,所有依赖于它的对象都将得到通知并更新自己。

    现在要说的分歧在这里:

    “推”的方式是指,Subject维护一份观察者的列表,每当有更新发生,Subject会把更新消息主动推送到各个Observer去。

    “拉”的方式是指,各个Observer维护各自所关心的Subject列表,自行决定在合适的时间去Subject获取相应的更新数据。

    “推”的好处包括:

    1、高效。如果没有更新发生,不会有任何更新消息推送的动作,即每次消息推送都发生在确确实实的更新事件之后,都是有意义的。

    2、实时。事件发生后的第一时间即可触发通知操作。

    3、可以由Subject确立通知的时间,可以避开一些繁忙时间。

    4、可以表达出不同事件发生的先后顺序。

    “拉”的好处包括:

    1、如果观察者众多,Subject来维护订阅者的列表,可能困难,或者臃肿,把订阅关系解脱到Observer去完成。

    2、Observer可以不理会它不关心的变更事件,只需要去获取自己感兴趣的事件即可。

    3、Observer可以自行决定获取更新事件的时间。

    4、拉的形式可以让Subject更好地控制各个Observer每次查询更新的访问权限。

    ----------------------------------------------------------------------------------------------------------------------------------

    2012-2-27 补充:

    事实上“推”和“拉”可以比较的内容太多了,比如:

    客户端通常是不稳定的,服务端是稳定的,如果消息由客户端主动发起去获取,它很容易找到服务端的地址,可以比较容易地做到权限控制(集中在服务端一处),服务端也可以比较容易地跟踪客户端的位置和状态,反之则不行;

    互联网页面的访问就是一个最好的“拉”的模式的例子;

    通常我们希望把压力分散到各个客户端上去,服务端只做最核心的事情,只提供内容,不管理分发列表;

    ……

    还有一个idea是关于“推”和“拉”结合的形式,例如,服务端只负责通知某一些数据已经准备好,至于是否需要获取和什么时候客户端来获取这些数据,完全由客户端自行确定。

  • 相关阅读:
    leetcode 34 rust
    leetcode 2 rust
    leetcode 1 rust
    leetcode 20 rust
    leetcode 287 rust
    leetcode 18 rust
    lottery抽奖
    webpack
    webpack(7)-生产环境
    webpack(6)-模块热替代&tree shaking
  • 原文地址:https://www.cnblogs.com/changbaishan/p/5035551.html
Copyright © 2011-2022 走看看