zoukankan      html  css  js  c++  java
  • 观察者模式——出版者与订阅者

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

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



  • 相关阅读:
    HCNA配置ssh远程登陆
    HCNA配置telnet远程管理
    HCNA配置接口IP地址
    HCNA配置console线路密码aaa认证
    HCNA配置console线路密码password认证
    CentOS6.9上安装FreeSWITCH1.6.19
    vos语音业务规范操作承诺函
    vos对接时业务确认及信息安全责任承诺书
    Ubuntu 16下安装64位谷歌Chrome浏览器
    Python更新pip出现错误解决方法
  • 原文地址:https://www.cnblogs.com/saixing/p/6730313.html
Copyright © 2011-2022 走看看