`
lu930124
  • 浏览: 28536 次
  • 性别: Icon_minigender_2
  • 来自: 廊坊
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

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


2、观察者模式定义

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

3、观察者 模式类图


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

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

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

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

4.代码示例

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

类图如下:

气象站主题代码如下


在WeatherData中实现主题接口


建立布告板代码


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


可以得到如下结果


总结

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




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics