再看设计模式——观察者模式

      随着软考的进行,开始了新一轮设计模式的学习,距离上一次这种整体、从头到尾学习设计模式已经有一段时间了。上次整体上的学习中,主要是了解,简单的使用设计模式。随着这一段时间的接触,潜移默化,这次的学习,相对深入一些。下面我以观察者模式为例,记录一下这次设计模式的学习。(以Head First 设计模式为主要材料)。

      1、复习什么是观察者模式

       我们看看报纸和杂志的订阅是怎么回事:报社的业务就是出版报纸向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸当你不想再看报纸的时候,取消订阅,他们就不会再送新报纸来只要报社还在运营,就会一直有人(或单位)向他们订阅报纸或取消订阅报纸。如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名称不太一样:出版者改称为“主题”(Subject),订阅者改称为“观察者”(Observer)。观察者模式,关系如图所示:


      2、观察者模式定义

      当你试图勾勒观察者模式时,可以利用报纸订阅服务,以及出版者和订阅者比拟这一切在真实的世界中,你通常会看到观察者模式被定义成:
                 a.观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
                 b.观察者模式定义了一系列对象之间的一对多关系
                 c.当一个对象改变状态,其他依赖者都会收到通知

      3、观察者 模式类图


      当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节观察者模式提供了一种对象设计,让主题和观察者之间松耦合为什么?
      关于观察者的一切,主题只知道观察者实现了某个接口(也就是Observer接口)。主题不需要知道观察者的具体类是谁、做了些什么或其他任何细节。

      任何时候我们都可以增加新的观察者
      因为主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们可以随时增加观察者事实上,在运行时我们可以用新的观察者取代现有的观察者,主题不会受到任何影响。同样的,也可以在任何时候删除某些观察者。

      我们可以独立地复用主题或观察者
      如果我们在其他地方需要使用主题或观察者,可以轻易地复用,因为二者并非紧耦合。

      改变主题或观察者其中一方,并不会影响另一方
      因为两者是松耦合的,所以只要他们之间的接口仍被遵守,我们就可以自由地改变他们。

      4.代码示例

      以气象站的例子为例(例子来自head first 设计模式)

      类图如下:

      

      气象站主题代码如下


      在WeatherData中实现主题接口


      建立布告板代码


      都建立成功之后,可以建立如下测试才程序


      可以得到如下结果


      总结

      到目前为止,这个设计模式的学习基本上是完善了。在一次学习,也是一次补充和加深的过程,有很多以前无法理解,不好理解或者不懂的问题,在这次学习中,基本上都解决了。一次次的学习和复习,一定会有很好的效果。毕竟,学习就是反复的过程。




版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/lucari/p/4608537.html