zoukankan      html  css  js  c++  java
  • 再看设计模式——观察者模式

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

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

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


          2、观察者模式定义

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

          3、观察者 模式类图


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

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

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

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

          4.代码示例

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

          类图如下:

          

          气象站主题代码如下


          在WeatherData中实现主题接口


          建立布告板代码


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


          可以得到如下结果


          总结

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




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

  • 相关阅读:
    jQuery入门和DOM对象
    jQuery事件
    基础,层次,选择器
    MarkDown快速入门(typora)
    source是读入环境配置文件的命令,不能读入vimrc
    vi中将tab键转化为空格
    django-rest-framework学习之Quickstart和Serializer--2017年4月10日至12日
    Flask-RESTful插件介绍--2017年4月7日
    python restful api 编程--2017年4月6日
    一个验证登录的程序:python编写flask架构restful风格--2017年4月6日
  • 原文地址:https://www.cnblogs.com/lucari/p/4608537.html
Copyright © 2011-2022 走看看