Head First 设计模式 第2章 观察者模式

第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章的观察者模式会在最近几天更新....

转载请注明出处,谢谢!

时间: 2024-10-19 01:58:46

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

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

设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说来自意大利电影<滴露牡丹开>中一个专门偷拍明星照片的一个摄影师的名字,“Paparazzo”,中文译为帕帕拉齐,俗语就是狗仔队.这些明星因狗仔队而荣,获得曝光率,也因狗仔队而损,被曝光负面新闻,不管怎么说,总之是“火起来了”,让明星们又爱又恨.(众人:鱼哥,你扯远了).咳咳,这个狗仔队其实嘛,也就

【读书笔记】设计模式第6章:行为型模式2

本文主要分析了中介者模式.观察者模式.备忘录模式.访问者模式.状态模式.解释器模式,介绍它们的定义.优缺点.使用场景,以及实例代码.为了深刻地理解设计模式,最重要的还是动手编写代码. 我参照书中的例程重新构想了一些更加生动.易于理解的例子,希望大家喜欢. 代码可以通过以下链接进行浏览: http://git.oschina.net/caipeichao/java-design-pattern 这些代码都经过编译运行,保证没有错误. 中介者模式 定义 也叫调停者模式 用一个中介对象来封装一系列同事

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

原文  第16章 观察者模式(Oberver Pattern) 观察者模式  概述:   在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动

第 16 章 观察者模式【Observer Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> <孙子兵法>有云:“知彼知己,百战不殆:不知彼而知己,一胜一负:不知彼,不知己,每战必殆”,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好的一个办法,我们今天就来讲一个间谍的故事. 韩非子大家都应该记得吧,法家的代表人物,主张建立法制社会,实施重罚制度,真是非常有远见呀,看看现在社会在呼吁什么,建立法制化的社会,在2000 多年前就已经提出了.大家可能还不知道,法家还有

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

设计模式之序-UML类图那点事儿 序 打14年年底就像写那么一个系列,用于讲设计模式的,代码基于JAVA语言,最早接触设计模式是大一还是大二来着,那时候网上有人给推荐书,其中就有设计模式,当时给我推荐的书我还隐约记得,叫GoF的,书名是<Design Patterns: Elements of Reusable Object-Oriented Software>,也即<设计模式>,机械出版社的将其翻译为<设计模式-可复用面向对象软件的基础>.至于为什么叫做GoF,那时候

方法的链式调用【参考javascript设计模式第6章】

对应经常使用jquery的朋友,方法的链式调用应该是已经很属性了,书上有模拟出一个很简单的类库代码, 见代码如下: Function.prototype.method = function(name,fn){ this.prototype[name] = fn; return this; }; (function(){ function _$(els){ ........ } /*Events  addEvent getEvent*/ _$.method("addEvent",func

【读书笔记】设计模式第五章:行为型模式

本文主要分析了模板方法模式.命令模式.责任链模式.策略模式.迭代器模式,介绍它们的定义.优缺点.使用场景,以及实例代码.为了深刻地理解设计模式,最重要的还是动手编写代码. 我参照书中的例程重新构想了一些更加生动.易于理解的例子,希望大家喜欢. 代码可以通过以下链接进行浏览: http://git.oschina.net/caipeichao/java-design-pattern 这些代码都经过编译运行,保证没有错误. 模板方法 定义 定义一个操作中的算法框架,而将一些步骤延迟到子类中 角色:抽

设计模式 ( 十七 ):Observer 观察者模式 -- 行为型

1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属. 2.问题 当一个对象的状态发生改变时,你如何通知其他对象?是否需要一个动态方案――一个就像允许脚本的执行一样,允

Java设计模式(八)观察者模式 迭代器模式

(十五)观察者模式 观察者模式,定义对象间一对多关系,一个对象状态发生改变,所有依赖于它的对象都收到通知并且自动更新,观察者与被观察者分开.例如邮件订阅.RSS订阅,如果有更新就会邮件通知你. interface Observers{ public void update(); } class Observer1 implements Observers{ public void update(){ System.out.println("observer1 has received"