Java观察者模式的困惑

一存 2012-06-26 11:07:22
请问Java观察者模式都是在什么情况下使用啊,我找了些资料看了下,说在订新闻然后新闻上有消息时通知已经注册的用户。代码我也看了,但是实际操作起来怎么用啊,个人感觉直接通过SQL文查出来都有哪些用户订阅了新闻然后一个for循环把消息发出去不就行了么,那么这个观察者模式到底有什么用呢?还是某个程序能把所有用户信息一直存在对应的对象中,有消息的时候直接通知这些用户?

比较啰嗦,但真的很疑惑。
...全文
1039 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序男 2014-08-11
  • 打赏
  • 举报
回复
正好在看设计模式之禅:这里给出观察者模式的使用场景和案例: 观察者模式的使用场景 1.关联行为场景,注意,关联行为是可拆分的,而不是“组合”关系。 2.事件多级触发场景, 3.跨系统的消息交换场景,如消息队列的处理机制。 最佳实践 1.文件系统 在文件下新建一个文件,这个动作会同时通知目录管理其增加该目录,并通知磁盘管理器减少1KB的内存空间,也就是说”文件“是一个被观察者,”目录管理器“和“磁盘管理器” 是观察者。 2.猫鼠游戏 猫的叫声,引起了老鼠和主人的响应。 3.ATM取钱 4.广播收音机 5.SSH三大框架对Bean的操作用到了这种模式。、 6.基于观察者模式的委派事件模型(Delegation Event Model或DEM 在AWT中常见)。 这些设计模式要在具体场景分析完后再参照某些设计原则和模式案例来满足自己的业务需求。
乔山 2013-09-26
  • 打赏
  • 举报
回复
温故而知新,学习了。总结上面说的几点要义: 通过 集合 + 接口 来实现,于是才形成了解耦合 定义对象间的一种一对多的依赖关系,当一个对象的状态改变时,所有依赖于它的对象都得到通知并被自动更新。 在java gui编程中,在一个Jpanel(A)中有N个JPanel(B),A的大小是可调的,并且A的大小会影响到B的大小及内容。故将A做为Observable,B在A处注册并成为A的Observer,每次改变A的大小都会同时改变B的大小及内容。
一存 2012-06-28
  • 打赏
  • 举报
回复
谢谢大家的解答,我最近正在看《研磨设计模式》这本书,感觉观察者模式最大的特点就是动态联动了吧,当然解耦也是一方面。说Java中Swing的事件处理就是观察者模式的。看了看书,再加上大家的帮忙,感觉理解了挺多了,第一次发帖就有这么多好心人,泪奔ing...
ShaneLooLi 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
它的适用性,比如一条是:
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
[/Quote]

嗯,是的。意思是说这些需要改变的对象,是程序运行起来才能知道的,而在编程的时候不能显式地知道。

不过其实就算编程时知道要改变几个对象,依然可以使用观察者模式。无论怎么应用,其要义,就是由先改变的对象,主动调用待改变的对象的某些方法。因为这种调用可以通过 集合 + 接口 来实现,于是才形成了解耦合的效果。不然不能解耦合。
brightyq 2012-06-26
  • 打赏
  • 举报
回复
观察者模式意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态改变时,所有依赖于它的对象都得到通知并被自动更新。

它的适用性,比如一条是:
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。

LZ找一个设计模式的书看下,体会下实现思路,看出问题后再在论坛上问这样效果更好点。
ak47wjs 2012-06-26
  • 打赏
  • 举报
回复
观察者模式其实就是为了解偶,如果按你所说的直接通知的话,那你就需要获得该对像的引用,如果那天你的程序需要实现别外一种订阅(非用户)那就就需要更改代码了,这就违背了开-闭原则,利用观察者模式的话就只需实现监听器接口,并加入即可。
MultiArrow 2012-06-26
  • 打赏
  • 举报
回复
观察者模式的应用场景?我在java gui编程中使用过,大体是在一个Jpanel(A)中有N个JPanel(B),A的大小是可调的,并且A的大小会影响到B的大小及内容。故将A做为Observable,B在A处注册并成为A的Observer,每次改变A的大小都会同时改变B的大小及内容。
楼主所说的那种情况,SQL都都把订阅的用户查出来,那就用不着观察者模式了。
ShaneLooLi 2012-06-26
  • 打赏
  • 举报
回复
关于编程模式,我有一点告诫。编程原则(Principle)是真正应该去理解其发生来源与实际意义的东西。编程模式本身是别的程序员在编程过程中,总结出的一些定式,就像物理公式一样。物理和数学不一样,光应用公式是学不好的,主要还是理解机理,从而可以自己临时开发出各种公式。
  对于一个好的程序员来说,平时编程应该多多思考自己程序和编程原则的契合。至于模式,主要应该是顺便总结出来的,就算不总结也不是太严重的事情。只有偶尔遇到了障碍想不出好的解决方法,或者有时间学习别人的编程经验之时,才接触别人的编程模式,从而产生一些启发或者感想什么的。
  我们不应该把编程模式作为学习编程的基准。要有自己随便一想,就能找到经典编程模式在某种条件下不合用之处的自信。

接下来,来解释一下观察者模式。程序过程都是由某些开端开始的。这种开端可以是用户操作,可以是某一个时间到了于是开始定时任务,可以是一个不断循环的过程终于满足了什么条件,或者一些传感器来了信号,等等。由这些开端开始,程序一步一步往下执行。在 Java 中就是开端方法中调用了某个别的对象的方法,在调用的方法中又继续调用了方法,以此逐步进行。
  观察者模式,是一种调用组织方式的编程模式。其意味着由事件开端,主动去调用下一步该执行的方法。比如你说新产生了一条新闻。那么软件系统咋知道新产生了一条新闻?很可能是新闻提供商调用了系统的 WebService 接口,传入了一条新的新闻内容对吧?以此为例。那么观察者模式,就是在这个新闻内容传入之后,立刻开始检索数据库,看都有谁订了新闻,然后逐一发送邮件或者某种形式的通知。
  并不是非得这样设计呀。可以将新闻记入数据库。以后订阅者谁执行了“读取新闻”操作,再临时搜索一遍数据库看有没有新闻。你看,这至少就是二种程序执行过程的组织方法。第一种的思路,就和观察者模式的思路是一样的。

可以说,如果一个程序过程,里边要并列地调用好几个对象的方法,而且这些调用是平级不分先后的,那么这种设计其实就已经可以叫做“观察者模式”了。需要在什么时候使用什么组织方式,应该建立在思考程序效率的基础上。如果硬件条件足够好,那么就变成了“能实现就行”。当然了,作为程序员,我们可能需要自己要求自己;以后这种要求,会给你的职业生涯带来很多益处。

50,533

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧