日期:2014-05-20  浏览次数:20674 次

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

比较啰嗦,但真的很疑惑。

------解决方案--------------------
关于编程模式,我有一点告诫。编程原则(Principle)是真正应该去理解其发生来源与实际意义的东西。编程模式本身是别的程序员在编程过程中,总结出的一些定式,就像物理公式一样。物理和数学不一样,光应用公式是学不好的,主要还是理解机理,从而可以自己临时开发出各种公式。
  对于一个好的程序员来说,平时编程应该多多思考自己程序和编程原则的契合。至于模式,主要应该是顺便总结出来的,就算不总结也不是太严重的事情。只有偶尔遇到了障碍想不出好的解决方法,或者有时间学习别人的编程经验之时,才接触别人的编程模式,从而产生一些启发或者感想什么的。
  我们不应该把编程模式作为学习编程的基准。要有自己随便一想,就能找到经典编程模式在某种条件下不合用之处的自信。

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

可以说,如果一个程序过程,里边要并列地调用好几个对象的方法,而且这些调用是平级不分先后的,那么这种设计其实就已经可以叫做“观察者模式”了。需要在什么时候使用什么组织方式,应该建立在思考程序效率的基础上。如果硬件条件足够好,那么就变成了“能实现就行”。当然了,作为程序员,我们可能需要自己要求自己;以后这种要求,会给你的职业生涯带来很多益处。
------解决方案--------------------
观察者模式的应用场景?我在java gui编程中使用过,大体是在一个Jpanel(A)中有N个JPanel(B),A的大小是可调的,并且A的大小会影响到B的大小及内容。故将A做为Observable,B在A处注册并成为A的Observer,每次改变A的大小都会同时改变B的大小及内容。
楼主所说的那种情况,SQL都都把订阅的用户查出来,那就用不着观察者模式了。
------解决方案--------------------
观察者模式其实就是为了解偶,如果按你所说的直接通知的话,那你就需要获得该对像的引用,如果那天你的程序需要实现别外一种订阅(非用户)那就就需要更改代码了,这就违背了开-闭原则,利用观察者模式的话就只需实现监听器接口,并加入即可。
------解决方案--------------------
观察者模式意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态改变时,所有依赖于它的对象都得到通知并被自动更新。

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

LZ找一个设计模式的书看下,体会下实现思路,看出问题后再在论坛上问这样效果更好点。
------解决方案--------------------
引用:
它的适用性,比如一条是:
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。


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

不过其实就算编程时知道要改变几个对象,依然可以使用观察者模式。无论怎么应用,其要义,就是由先改变的对象,主动调用待改变的对象的某些方法。因为这种调用可以通过 集合 + 接口 来实现,于是才形成了解耦合的效果。不然不能解耦合。