第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. google和oracle闹掰,Java 会不会被抛弃?

    眼花缭乱的编程语言 程序界的语言实在太多,但有一种语言不得不说,那就是java语言,Java语言是Android系统的主要开发语言,现在和Google的关系不是很好,但是他会被淘汰吗?下面简单地分析一 ...

  2. 遇到的Mysql的一个坑

    自己写的Java代码怎么也无法操作MySQL的写操作,打印SQL语句没有问题,检查连接也没有问题,最后手动写了一条记录,发现主键重复了,但是当时表是空的!所以就很震惊,于是选择删表重新来一次,这回成功 ...

  3. 14.什么是jsp动作

    JSP动作元素(action elements),动作元素为请求处理阶段提供信息.动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性,可选的内容,与开始标签匹配的结束标签. 包含的类 ...

  4. RocksDB上锁机制

    RocksDB作为一个开源的存储引擎支持事务的ACID特性,而要支持ACID中的I(Isolation),并发控制这块是少不了的,本文主要讨论RocksDB的锁机制实现,细节会涉及到源码分析,希望通过 ...

  5. SQL联表查询

    数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(tab ...

  6. 详解Mysql自动备份与恢复

    通过 mysqldump命令,直接生成一个完整的 .sql 文件 Step 1: 创建一个批处理备份SQL c: cd C:Program Filesmysql5.6.24bin mysqldump ...

  7. 超好用的memcache管理及可视化监控工具,真方便!

    memcache做为主流的缓存数据库之一,广泛在各互联网平台使用,但是大家使用中都知道memcache目前没有一个比较好用的可视化客户端工具,每次都要输入命令进行操作,十分不方便.  而另一款主流缓存 ...

  8. MVC通过递归+部分视图实现评论

    前一个项目里有一个关于评论系统的需求.感觉这个评论的实现还是蛮好玩的,所以记录下这个系统的实现相关内容. 功能需求: 1.用户可以再视屏下方留言. 2.用户可以再别的用户留言下方回复. 3.用户可以删 ...

  9. Immutable的认识

    Facebook 工程师 Lee Byron 花费 3 年时间打造,与 React 同期出现,但没有被默认放到 React 工具集里(React 提供了简化的 Helper).它内部实现了一套完整的 ...

  10. AsyncTask onPreExecute方法用于在执行后台任务前做一些UI操作

    1.实例化 TableListsTask task = new TableListsTask(ServerIP,"ALL", MenuActivity.this);   //第三参 ...