`

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

阅读更多

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


 

现在要说的分歧在这里:

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

 

文章系本人原创,转载请注明作者和出处

  • 大小: 27.6 KB
1
0
分享到:
评论
2 楼 Uestc_Coolsun 2012-05-08  
Mybeautiful 写道
严格来说,“拉”的方式 不是观察者模式。当然其是个好模式

我不这么认为,因为“拉”的方式,你也可以去通知观察者我也什么发生变化了。只是被观察对象更新的数据不会主动推到观察者哪里,观察者可以根据自己的需要来自己拉取。
1 楼 Mybeautiful 2012-01-07  
严格来说,“拉”的方式 不是观察者模式。当然其是个好模式

相关推荐

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...

    Qt实现全局观察者模式(多层窗体之间直接传递消息)

    在Qt框架中,实现全局观察者模式是一种有效的方式,它能解决多层窗体之间通信的问题,特别是当窗体层次复杂时,直接传递消息变得困难。观察者模式(Observer Pattern)是设计模式的一种,用于定义对象之间的一对多...

    设计模式-观察者模式(讲解及其实现代码)

    在实际编程中,观察者模式可以采用两种方式实现: - **接口实现**:定义一个`Observer`接口,让所有观察者实现该接口的`update()`方法。主题通常包含一个`List<Observer>`来存储观察者,通过接口调用每个观察者的...

    56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1

    * 消息队列:在消息队列中,观察者模式可以用来处理消息的发布和订阅。 * 订阅发布系统:在订阅发布系统中,观察者模式可以用来处理订阅请求和发布信息。 观察者模式是一个非常重要的设计模式,它可以帮助我们解决...

    java观察者模式观察者模式

    观察者模式是设计模式中的一种行为模式,它在Java编程中有着广泛的应用。该模式的主要目的是定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式也被...

    观察者模式消息传递GameUilts

    观察者模式是软件设计模式中的一种,主要用于实现对象间的松耦合通信。在Unity游戏开发中,这种模式常被用来处理游戏对象之间的交互和事件传递,以提高代码的可维护性和可扩展性。GameUtils是一个可能包含了一系列...

    java 设计模式 观察者模式 简单实例 包括测试test类

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或者发布...

    iOS 设计模式 观察者模式

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为模式。在iOS开发中,它是一种让多个对象监听或订阅某一个主题对象的状态变化,并在状态变化时自动收到通知的方式。这种模式使得...

    运用MVC模式及观察者模式的java小程序

    在这个名为“运用MVC模式及观察者模式的java小程序”的项目中,我们重点探讨了两种经典的设计模式:Model-View-Controller(MVC)模式和Observer(观察者)模式。这两种模式在JavaWeb开发中扮演着至关重要的角色。 ...

    Qt设计模式之观察者模式

    本篇文章将深入探讨Qt中的观察者模式(Observer Pattern),这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心...

    设计模式--观察者模式java例子

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    观察者模式模版和例子

    在提供的压缩包文件中,`观察者模式模版和例子`可能包含了实现这些概念的代码示例,通过阅读和理解这些代码,你可以更好地掌握观察者模式的实现细节和应用方式。为了深入学习,建议先了解观察者模式的基本概念,然后...

    基于观察者模式两个activity通信

    在这个场景中,我们关注的是如何使用观察者模式(Observer Pattern)来实现Activity A和C之间的数据交互。观察者模式是一种行为设计模式,它允许一个对象(观察者)在另一个对象(被观察者)的状态改变时自动收到...

    Java内置观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的其他对象。在Java中,这种模式已经被内置到语言核心,使得开发者可以轻松地实现事件驱动...

    观察者模式.pdf

    观察者模式有两种主要的通信方式:推(Push)和拉(Pull)。 - 推(Push):发布者主动将更新推送给订阅者。在报纸的例子中,这相当于发行方雇佣投递员将报纸送到订阅者家中。 - 拉(Pull):订阅者需要主动从发布...

    Head First 之之观察者模式

    4. **案例分析**:通过实际案例,如用户界面控件的事件处理、多线程环境下的消息传递等,深入分析观察者模式的应用场景和优势,同时讨论可能遇到的问题和解决策略。 5. **扩展与变体**:书籍可能会讨论一些观察者...

    观察者模式使用

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一,主要用于对象间的一对多依赖关系管理。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这个...

    观察者模式Demo

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统,...

    观察者模式java实现观察者设计模式

    在Java中,我们可以利用Java提供的内置监听器机制来实现观察者模式,例如`ApplicationListener`和`ApplicationEvent`,这两个类主要用于Swing或JavaFX应用程序中的事件处理。 首先,我们来看`ApplicationListener`...

Global site tag (gtag.js) - Google Analytics