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

  • 相关阅读:
    oracle分页查询sql写法
    查询一张表的id,不在另外一张表的某个字段的数据
    PowerDesigner 使用详解
    java JUC多线程高并发编程
    npm node-sass安装失败解决方法
    Vue中展示二级路由的默认模块 若依框架 自定义指令权限的使用说明
    vue 2.6以后slot 的变化使用
    java中 List<? extends T>与List<? super T> 表示的意思和区别
    java springboot自定义注解 和 时间加一天 一个月 一年方式
    js中||与&&的用法以及every()与some()的用法
  • 原文地址:https://www.cnblogs.com/changbaishan/p/5035551.html
Copyright © 2011-2022 走看看