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

       在说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》中总会给你一些新的理解。比方博客中蓝字标出的文字。假设不能理解这些原则,即使代码实现了也没有多大的收获。所以,博客中并没有给出观察者模式的代码实例。

      学习须要重复,每个重复都让你的认识更加深入。



原文地址:https://www.cnblogs.com/mthoutai/p/7366391.html