`

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

阅读更多

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


 

现在要说的分歧在这里:

“推”的方式是指,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  
严格来说,“拉”的方式 不是观察者模式。当然其是个好模式

相关推荐

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

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

    Qt设计模式之观察者模式

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

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

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

    设计模式-观察者模式.ppt

    总结来说,观察者模式是一种重要的设计模式,它提供了一种在对象之间传播事件的方式,使得系统可以响应变化,而无需硬编码依赖关系。通过接口和抽象,观察者模式实现了松耦合,提高了代码的复用性和可扩展性,是构建...

    设计模式-观察者

    7. **其他变体**:除了基本的观察者模式,还有复合观察者模式,允许一个观察者对象包含多个观察者,以及异步观察者模式,通知过程在不同的线程中执行,以避免阻塞主线程。 在实际开发中,理解并熟练运用观察者模式...

    观察者模式消息传递GameUilts

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

    使用MFC实现观察者模式(Observer)同时兼顾多窗口之间传值

    在MFC(Microsoft Foundation Classes)框架中,我们可以利用其消息机制来实现观察者模式,这在多窗口之间的通信中尤其有用。 首先,我们需要理解MFC中的消息机制。MFC是基于Windows API的,它封装了Windows的消息...

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

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

    观察者模式模版和例子

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

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

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

    Java内置观察者模式

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

    观察者模式.pdf

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

    设计模式:观察者模式java和javabean

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

    观察者模式练习

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

    Head First 之之观察者模式

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

    设计模式之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

    观察者模式Demo

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

    观察者模式源码

    在实际开发中,观察者模式广泛应用于事件处理、GUI编程、消息传递等场景,例如Java Swing和JavaFX中的事件处理机制就是基于观察者模式实现的。 以上就是关于观察者模式的基本概念和一个简单的实现示例。在实际项目...

    设计模式之观察者模式

    在实际应用中,观察者模式广泛应用于各种场景,如GUI组件之间的事件处理、消息队列、日志系统等。理解并熟练运用观察者模式,对于编写可维护、可扩展的软件至关重要。在Java中,`java.util.Observable`和`java.util....

    Java观察者模式案例

    观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件处理、发布订阅系统、消息...

Global site tag (gtag.js) - Google Analytics