博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再看设计模式——观察者模式
阅读量:5054 次
发布时间:2019-06-12

本文共 1270 字,大约阅读时间需要 4 分钟。

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

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

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

      2、观察者模式定义

      当你试图勾勒观察者模式时,可以利用报纸订阅服务,以及出版者和订阅者比拟这一切在真实的世界中,你通常会看到观察者模式被定义成:

                 a.观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
                 b.观察者模式定义了一系列对象之间的一对多关系
                 c.当一个对象改变状态,其他依赖者都会收到通知

      3、观察者 模式类图

      当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节观察者模式提供了一种对象设计,让主题和观察者之间松耦合为什么?

      关于观察者的一切,主题只知道观察者实现了某个接口(也就是Observer接口)。主题不需要知道观察者的具体类是谁、做了些什么或其他任何细节。

      任何时候我们都可以增加新的观察者

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

      我们可以独立地复用主题或观察者

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

      改变主题或观察者其中一方,并不会影响另一方

      因为两者是松耦合的,所以只要他们之间的接口仍被遵守,我们就可以自由地改变他们。

      4.代码示例

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

      类图如下:

      

      气象站主题代码如下

      在WeatherData中实现主题接口

      建立布告板代码

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

      可以得到如下结果

      总结

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

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

转载于:https://www.cnblogs.com/lucari/p/4608537.html

你可能感兴趣的文章
两只小熊队高级软件工程第九次作业敏捷冲刺4
查看>>
推荐一个好用的虚拟主机
查看>>
ulimit
查看>>
php代码执行顺序
查看>>
php 写入数据到MySQL以及从MySQL获取数据,页面出现乱码的解决方法
查看>>
MYSQL视图的学习笔记
查看>>
爬虫基础
查看>>
laravel常用artisan命令
查看>>
130292015038 张雅周 第一章作业
查看>>
获取文件字段并生产一个新的页面
查看>>
IIS 添加 MIME
查看>>
[转]协同管理系统
查看>>
安装了OFFICE2007,每次打开word时都显示配置microsoft office professional plus 解决方法...
查看>>
联合体和结构体的区别
查看>>
相同文件名引发的教训
查看>>
android调用系统相机并获取图片
查看>>
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
查看>>
Spark共享变量(广播变量、累加器)
查看>>
mongoose项目随笔
查看>>
JBOSS实现RMI时注意的问题
查看>>