第2章、观察者模式

1、定义:

  在对象之间定义一对多关系,当一个对象改变状态时,该对象的依赖会收到通知,并自动更新。

2、介绍

  在介绍观察者模式之前,先来说一个日常生活中经常碰到的事(可能现在的人碰到的少了,但是老一辈人喷到的要多的多),那就是关于报纸的订阅。在报纸订阅这整个事件中牵扯到了报社、订阅者、邮递员这三个角色,我们来看一看这三个角色在事件中分别都负责什么工作。

  报社,主要工作有(1)给订阅者办理/撤销报纸订阅,(2)发行新报纸,(3)将发行的新报纸分派给邮递员

  邮递员,主要工作有(1)将新发行的报纸投递给订阅者

  订阅者,主要工作有(1)告诉报社我要[取消]订阅报纸,(2)接收投递员投递的报纸

  在这整个事件中,只要订阅者不主动取消订阅并且报社不倒闭,则订阅者就会一直收到来自报社的最新报纸,由此,我们就可以引出观察者模式:出版者(报社+投递员)+订阅者=观察者模式

  让我们用几个图来大致说一下观察者模式的应用场景:

  观察者模式类图:

  

  简单说下这个类图,左上部分是主题(也就是可观察者或者说是主题提供者[我更喜欢这么叫]),右下部分是观察者(主题订阅者)。其中Subject接口是主题提供者接口,所有的主题提供者都必须实现该接口,WeatherData是一个具体的主题提供者;Observer接口是主题订阅者接口,所有的订阅者都必须实现该接口,DisplayElement接口是一个用于展现的接口,想要该功能的订阅者也要实现该接口(本例中都实现了该接口)。

  接下来简单说一下实现过程,代码我会付到文章结尾供大家下载参考。

    A、WeatherData实现Subject接口;

    B、订阅者类实现Observer接口;

    C、将主题提供者(Subject)作为订阅者(Observer)的一个属性,在订阅者实例化时,自动注册[调用registerObserver()方法]到主题提供者内;

    D、当主题提供者(Subject)内的信息发生变化时,自动调用measurementChanged()方法将通知推送[调用notifyObverser()方法]给订阅者(Observer);

    E、订阅者获取最新的信息并更新[调用update()方法]本地信息

3、本章要点

  Ж 观察者定义:定义了一对多关系,当一个对象改变状态时,该对象的依赖会收到通知,并自动更新。

  Ж 新设计原则:为交互对象之间的松耦合设计而努力

  Ж 主题(也就是可观察者)用一个共同的接口来更新观察者

  Ж 观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者的具体细节,只知道观察者实现了观察者接口

  Ж 使用此模式时,观察者可以从被观察者处推(push)或者拉(pull)数据(然而,推的方式被认为更“正确”)

  Ж 有多个观察者时,不可依赖特定的通知顺序

  Ж Java有多种观察模式的实现,包括了通用的java.util.Observable。要明确使用java.util.Observable可能带来的问题,如果有必要可以自己实现观察者模式,这并不难

  

关于第2章 观察者模式模式就介绍到这里,如果以上内容有出错的地方,还请不吝赐教;如果大家觉得有讲的不明白地方,也可提出来,大家共同学习。

第3章的装饰者模式会在最近几天更新....

转载请注明出处,谢谢!

Head First 设计模式 第2章 观察者模式的更多相关文章

  1. 设计模式之第18章-观察者模式(Java实现)

    设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...

  2. [head first 设计模式]第二章 观察者模式

    [head first 设计模式]第二章 观察者模式 假如我们有一个开发需求--建造一个气象观测站展示系统.需求方给我们提供了一个WeatherObject对象,能够自动获得最新的测量数据.而我们要建 ...

  3. 第16章 观察者模式(Oberver Pattern)

    原文  第16章 观察者模式(Oberver Pattern) 观察者模式  概述:   在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依 ...

  4. Java设计模式(20)观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

  5. php设计模式课程---4、观察者模式的好处是什么

    php设计模式课程---4.观察者模式的好处是什么 一.总结 一句话总结: 方便选择之后去控制监听的板块数:比如选择男士之后,我可以决定监听广告里面的第二和第三板块. 1.为什么有观察者模式? 错误理 ...

  6. 设计模式之序章-UML类图那点事儿

    设计模式之序-UML类图那点事儿 序 打14年年底就像写那么一个系列,用于讲设计模式的,代码基于JAVA语言,最早接触设计模式是大一还是大二来着,那时候网上有人给推荐书,其中就有设计模式,当时给我推荐 ...

  7. java设计模式解析(1) Observer观察者模式

      设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...

  8. [Python设计模式] 第14章 老板来了——观察者模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 用程序模拟以下情景,在一个办公室里,当老板进门的时候,前台秘书就偷偷通知办 ...

  9. 大话设计模式C++实现-第14章-观察者模式

    一.UML图 关键词:Subject维护一个Observer列表.Subject运行Notify()时就运行列表中的每一个Observer的Update(). 二.概念 观察者模式:定义了一种一对多的 ...

随机推荐

  1. 警惕System.Environment.CurrentDirectory 获取当前目录

    最近工作中,要做个客户端提醒的小工具:winform程序自然少不了要读取和应用程序同一个目录的配置文件(不是exe.config文件): 要读取当前应用程序所在目录我立马想到了System.Envir ...

  2. C++学习笔记——大杂烩

    C++学习笔记--大杂烩                                                         by方阳 版权声明:本文为博主原创文章,转载请指明转载地址 h ...

  3. JavaScript深入浅出补充——(一)数据类型,表达式和运算符

    项目基本做完,在进行下一阶段学习之前先看视频学习回顾一下JavaScript 一.数据类型 JavaScript中有五种原始类型和一种对象类型 JavaScript弱类型语言中隐式转换 num-0 字 ...

  4. 在vs2010中显示代码的行数

    1.打开VS2010,然后"工具" → "选项" 2.在选项页面,点击"文本编辑器"→"所有语言",在显示里将[行号]选 ...

  5. window.getSelection和document.selection

    window.getSelection和document.selection   IE9以下支持:document.selection IE9.Firefox.Safari.Chrome和Opera支 ...

  6. v2013调试无法访问此网站 localhost 拒绝了我们的连接请求

    问题描述:          别人给的服务器代码,在本地部署以后调试的,localhost:8080 可以访问,localhost:2524访问不了需要改什么配置吗 解决思路:           这 ...

  7. JAXP Dom 案例 对xml文件进行增加 查找 删除

    利用 JAXP 对 XML文件 的处理,把xml当做一个数据库来对待

  8. requireJS 源码(三) data-main 的加载实现

    (一)入口 通过 data-main 去加载 JS 模块,是通过  req(cfg) 入口去进行处理的. 为了跟踪,你可以在此 加断点 进行调试跟踪. (二)  req({ })执行时,functio ...

  9. 前端模块化工具--webpack使用感受

    话说前头 webpack前段时间有听说一下,现在已经到了3.x的版本,自己没去接触.因为之前使用gulp来作为自己的项目构建工具.现在感觉gulp使用的趋势在减少.现在这段时间去接触了webpack, ...

  10. 处理SFTP服务器上已离职用户,设置为登录禁用状态

    测试用户禁用SQL select Enabled,LoginID from suusers where LoginID = 'yangwl' update suusers set Enabled=1 ...