观察者模式——出版者与订阅者

       在说Java内置的观察者模式之前,我们先来回顾一下大话中这个模式的例子。如下图,前台负责通知那些看股票和看新闻的人,告知他们情况,这些看股票、看新闻的人对此做出反应,比如停下来继续工作等等。

      故事大概就是这样,回忆不起来的同学可以再翻翻书看一下。



      回忆了观察者模式之后,我们来看一个新的例子——出版者和订阅者。

      观察者模式定义了一系列对象之间的一对多的关系。

      先不看复杂的类图,看一张简单的图:三个订阅者订阅了该出版社,当出版社有了新的书籍或杂志的话,就将消息通知给三位订阅者,他们三个就是观察者。

      当一个对象改变状态,其他依赖者就会收到通知。


      由上面的图,可以看出。主题对象(上面的出版者)与观察者(订阅者A,B,C)他们是一对多的关系,可不可能是多对多呢?

      当然不可以,虽然在实际上一个订阅者可能会订阅多个出版者,但在观察者中,我们让多个观察者同时监听一个主题对象,当主体对象在状态上发生变化时会自动通知观察者,使他们能够自动更新自己。在这里,还可以回到开篇的例子中,如果有两个前台,一个说老板来了,一个说老板没来,那不就乱套了。


观察者的“去”与“留”

       订阅者A说到,这家出版社太不行了,新闻不够及时,书也不好看,我不想订阅了。这时候A是不可以自己擅自离开这个观察者群体的,他要向出版者请示,待出版者同意后,把A从中剔除,A以后就不会再收到出版者的消息了。

      同样,如果D想成为一个订阅者,他也不能擅自进入,也要等待主题对象的批准才可以进入。


为了交互对象之间的松耦合设计而努力

      在出版者和订阅者的例子中,二者并不十分清楚对方内部的结构和细节部分。这就是一种松耦合的设计,这样一来,也使得观察者的“去”和“留”更加灵活,系统也更富有弹性。


观察者模式中的“推”与“拉”

      出版者得到消息后,通知给订阅者。在这个过程中,显然出版者处于主动地位,而订阅者是被动接受通知才改变自己的。所以说,主题对象出版者一直是在往外推,而不让观察者们从自己中取(也就是所谓的”拉“)。


Java内置的观察者模式

这里要用到的是java.util包中的Observer接口和Observable类。


      在Java中,使用Observable类和Observer接口后,不再是Subject和Observer两个接口了,取而代之的是Java内置的Observable类和Observer接口。因此,Publisher是继承而非实现。

     注意:

     1)虽然两个图中都有Observer接口,但这两个是不同的。一个是自己定义的接口,一个是Java中已经有的接口。

     2)类图中的一些方法都略去了,主要为了体现大体上的关系。



小结:

      再一次学习设计模式,跟第一次学大话的时候很不一样。《Head First》中总会给你一些新的理解,比如博客中蓝字标出的文字,如果不能理解这些原则,即使代码实现了也没有多大的收获。所以,博客中并没有给出观察者模式的代码实例。

      学习需要反复,每一个反复都让你的认识更加深入。



posted @ 2014-10-01 09:15  Sherry&Yang  阅读(171)  评论(0编辑  收藏  举报