学习笔记 ---- 设计模式之观察者模式

设计模式二之观察者模式学习笔记 设计模式二之观察者模式学习笔记需求开始设计观察者模式解决气象站的问题 观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变时,它的所有依赖者都会收到通知并自动更新。 业务需求如下: 需求 某公司有个气象装置,这个气象装置要通过温度、湿度、气压感应装置得到数据,然后通过一个系统 将天气状况显示在布告板上,暂时有三个布告板分别显示目前状况、气象统计和天气预报,要根据天气的变化及时更新布告板... 阅读详情
转载: http://www.cnblogs.com/shitouer/archive/2011/09/02/2164048.html

Head First里边给出的场景是:

    客户需要这样一个App:一个WheatherData类可以从气象站获得气象信息(temperature, humidity, pressure and so on).一旦这些信息改变,就会更新气象站的三个公告板(CurrentConditionBulletin, StatisticsBulletin and ForecastBulletin, 另外,用户还可以随时增加/删除/更改自己的布告板)。

    客户给出了WheatherData的类图:

    

    结合以上描述和类图我们已知:

    1. 由Getter可以或得气象信息

    2. 一旦气象信息有改变,调用measurementsChanged()方法更新所有的布告板

    3. 现在需要三个布告板

    4. Customer可以定义自己的布告板

    首先看一个不好的实现:

publicclass WeatherData {       
 
        publicvoid MeasurementsChanged()
        {
            floattemp = getTemperature(); 
            floathumidity = getHumidity(); 
            floatpressure = getPressure();
            currentConditionsDisplay.update(temp, humidity, pressure); 
            statisticsDisplay.update(temp, humidity, pressure);
            forecastDisplay.update(temp, humidity, pressure);
        }
}

?

  为什么不好呢?可以从已经知道的几个设计原则入手:

    1. 找出程序中变化的部分,将其与固定不变的部分隔离

    在这个场景中,变化的是布告栏的类型和数量,在这个不好的例子中,我们改变布告栏的类型和数量,势必要修改WheatherData这个类。如何才能可以随意修改布告栏的数量和类型,却不用修改WheatherData类呢?

    2. 针对接口编程,不针对实现编程

    明显,statisticsDisplay,statisticsDisplay,forecastDisplay均是具体的实现的编程,如果以后我们增加修改布告栏,都必须修改这段程序。而且三个方法( update() )的名字和参数相同,一个统一的接口可行?

    可以根据报纸订阅业务对观察者模式有一个简单的了解:

    观察者模式类图:

    

    Subject

    主题接口,也即可观察者(Observable),对象使用此接口注册为观察者,或者把自己从观察着中删除。每个主题可以有多个观察者。

    ConcreteSubject

    一个具体主题实现了主题接口,除了注册和撤销之外,具体主题还实现了notifyObservers()方法,这个方法用来在主题状态改变时更行所有的观察者。具体主题也可能有设置和获取状态的方法。

    Observer

    所有潜在的观察者必须实现观察者接口,这个接口只有update()方法,当主题改变时,它被调用。

    ConcreteObserver

    具体的观察者可以是任何实现了Observer接口的类。观察者必须注册具体主题,一边接收更新。

    基本原则:为了交互对象之间的松耦合设计而努力

    观察者模式的定义:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有的依赖者都会收到通知并自动更新。

    观察者模式中,一对多的关系体现在哪里?

    这个模式中,主题是具有状态的对象,并且可以控制这个状态,也就是说,是一个具有“状态”的主题。

    另一方面,观察者使用这些状态,虽然这些状态并不属于他们。有多个观察者,依靠主题来告诉他们主题状态何时变了。

    这就产生了一个关系,一个“主题”对多个“观察者”的关系

    松耦合设计威力体现在哪里?

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

    

    下面我们根据观察者模式来画出开篇WheatherStation的类图:

    

    代码如下

  ISubject:
?
importorg.jpatterns.gof.ObserverPattern;
 
@ObserverPattern(
        comment="ISubject: Interface of Observer Pattern"
)
publicinterface ISubject {
    voidregisterObserver(IObserver o);
    voiddeleteObserver(IObserver o);
    voidnotifyObservers();
}
  IObserver:
?
importorg.jpatterns.gof.ObserverPattern;
 
@ObserverPattern(
        comment="IObserver: Interface of Observer Pattern"
)
publicinterface IObserver {
    voidupdate(floattemp, floathumidity, floatpressure);
}
  实现了ISubject接口的WheatherData:
?
importjava.util.ArrayList;
 
importorg.jpatterns.gof.ObserverPattern;
 
@ObserverPattern(comment = "WheatherData: Concrete Subject of Observer Pattern")
publicclass WheatherData implementsISubject {
    privateArrayList<IObserver> observers;
    privatefloat temperature;
    privatefloat humidity;
    privatefloat pressure;
 
    publicWheatherData() {
        this.observers = newArrayList<IObserver>();
    }
 
    @Override
    publicvoid registerObserver(IObserver o) {
        observers.add(o);
    }
 
    @Override
    publicvoid deleteObserver(IObserver o) {
        if(observers.indexOf(o) >= 0) {
            observers.remove(o);
        }
    }
 
    @Override
    publicvoid notifyObservers() {
        for(inti = 0; i < observers.size(); i++) {
            IObserver observer = observers.get(i);
            observer.update(temperature, humidity, pressure);
        }
    }
 
    publicvoid measurementsChanged() {
        this.notifyObservers();
    }
 
    publicvoid setMeasurements(floattemperature, floathumidity, floatpressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        this.measurementsChanged();
    }
}
  实现了IObserver接口的一个Bulletin:
?
publicclass CurrentConditionsBulletin implementsIObserver, IDisplayElement {
 
    privatefloat temperature;
    privatefloat humidity;
    privateISubject wheatherData;
 
    publicCurrentConditionsBulletin(ISubject wheatherData) {
        this.wheatherData = wheatherData;
        wheatherData.registerObserver(this);
    }
 
    @Override
    publicvoid update(floattemp, floathumidity, floatpressure) {
        this.temperature = temp;
        this.humidity = humidity;
        this.display();
    }
 
    @Override
    publicvoid display() {
        System.out.println("Current Conditions: " + this.temperature
                +"F Degrees and " + this.humidity + "% Humidity");
    }
}
  创建气象站,将程序run起来:
?
publicclass WheatherStation {
 
    publicstatic void main(String[] args) {
        WheatherData wheatherData = newWheatherData();
        IObserver o1 = newCurrentConditionsBulletin(wheatherData);
        IObserver o2 = newStatisticsBulletin(wheatherData);
        IObserver o3 = newForecastBulletin(wheatherData);
        IObserver o4 = newCustomBulletin(wheatherData);//自定义的
        wheatherData2.setMeasurements(20,20,20);
    }
 
}

  省略了好多注释啊,想好好理解,还是推荐去看HeadFirst吧,说实话,真本书真好!

      其实在java中已经有内置的观察者模式。java.util中的Observable(类)和Observer(接口)。但是缺点不少,例如违反了:针对接口变成,而不是针对实现编程和多用组合少用继承两个原则,而且起nofify也依赖顺序。

      观察者模式的要点:

      观察者定义了对象之间一对多的关系。

      主题用一个共同的接口来更新观察者。

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

      使用此模式,可以从可观察者推或者拉数据。

      有多个观察者时,不可以依赖特定的通知次序。

      要注意java.util.Observable实现上带来的问题。

      如果有必要的话,可以实现自己的Observable。

    观察者模式的应用

    观察者模式的优点

    观察者和可观察者之间是抽象耦合

    建立了一套完整的触发链

    观察者模式的缺点

    多级触发的效率问题

    Java中消息的通知默认是顺序执行的,一个观察者卡壳,会影响整体的效率

    观察者模式的使用场景

    可拆分的关联行为场景

    事件多级触发的场景

    跨系统的消息交换场景

智能车赛道识别:八邻域算法的实战解析与优化 本文深入解析了智能车赛道识别中八邻域算法的核心原理与实战优化。作为兼顾性能与稳定性的经典方案,该算法通过模拟探险家环顾八方的策略,能精准追踪弯道与直道边界。文章详细拆解了代码逻辑,并提供了边界平滑、异常处理及应对十字路口、环岛等复杂场景的关键优化策略,助力开发者提升智能车视觉系统的鲁棒性与实时性。 阅读详情

相关推荐

Qt+PCL实战:如何用QVTKOpenGLNativeWidget高效渲染3D点云(附完整代码)

本文深入解析了Qt与PCL结合使用QVTKOpenGLNativeWidget进行高效3D点云渲染的实战技术。通过对比传统QVTKWidget,详细介绍了QVTKOpenGLNativeWidget在渲染效率、内存占用和兼容性方面的显著优势,并提供了完整的代码示例和性能优化策略,助力开发者在工业检测、自动驾驶等领域实现更高效的点云可视化。

keras9composer的博客 687

Head First 设计模式(二) 观察者模式

观察者模式: 定义了对象之间的一对多依赖,这样,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 松耦合:两个对象依然可以交互,但是不太清楚彼此的细节。 观察者模式提供了一种对象设计,让主题和观察者之间松耦合。 1.主题只知道观察者实现了某个接口(Observer)不知道观察者的具体细节。 2.任何时候都可以增加新的观察者 3.有新类型的观察者出现的时候,主题的代码

u013795673的博客 1021

虚拟机Ubuntu连接USRP

笔记本通过网线连接USRP。

xiaozir的博客 2308

观察者模式(Observer Pattern)

观察者模式(Observer Pattern)(对象行为型设计模式) ——在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。以松耦合方式在一系列对象之间沟通状态。观察者模式的代表——MVC。设计原则 封装变化——观察者模式中,会改变的是Subject的状态,以及观察者的数目和类型。用这个模式,可以改变依赖于主题状态的对象,却不必改变主题。 针对接口编程

Shingle_的博客 668

【毕设】基于LoRa的物联网控制器:从原理图到PCB的完整硬件设计指南

本文提供了一份完整的基于LoRa的物联网控制器硬件设计指南,涵盖从系统框图、原理图设计到PCB布局布线的全流程。详细讲解了电源电路、单片机最小系统、信号接口以及LoRa无线模块等核心模块的设计要点与抗干扰技巧,并分享了实用的调试心得,旨在帮助电子、物联网专业学生顺利完成毕业设计,掌握低功耗远距离物联网节点的硬件开发实践。

weixin_42126677的博客 307

QuestaSim使用Xilinx库的设置

安装QuestaSim

miracle_eicont的专栏 3409

设计模式 - 学习笔记 - ObserverPattern 观察者模式(Event事件模式)

设计模式 - 学习笔记 - 观察者模式ObserverPattern学习总结基本逻辑对比`订阅发布模式`对比`访问者模式` 学习总结 基本逻辑 定义发布者和观察者两个接口,然后实现1个发布者和n个观察者。 每个观察者都实现了自己的update(msg)方法来更新数据。 发布者维护一个观察者列表,并实现一个通知方法notify()遍历列表逐个调用观察者.update方法传入msg 对比订阅发布模式 观察者模式与订阅发布模式。后者对前者进一步拆分细化,将维护列表与发布通知工作独立出来作为调度中心。 强行

灵台方寸山斜月三星洞 555

LoRa双端通信稳定性核心:同步字配置与LLCC68工程实践

LoRa是一种基于扩频调制的远距离低功耗无线通信技术,其物理层鲁棒性依赖于发射端与接收端在频率、带宽、扩频因子及同步字等关键参数上的严格一致。同步字作为LoRa帧结构中位于前导码之后的2字节标识字段,承担着物理层帧过滤与网络隔离的核心作用,直接影响通信成功率与抗干扰能力。在实际嵌入式开发中,尤其采用LLCC68等专用射频芯片时,同步字配置错误或双端不一致是导致‘能发不能收’‘间歇性丢包’等典型问题的首要原因。本文面向STM32等Cortex-M平台开发者,结合硬件一致性约束、驱动移植方法论与寄存器级调试手段

weixin_36019375的博客 130

设计模式学习笔记--观察者模式(Observer Pattern)

概念观察者模式定义了对象之间的一对多的依赖关系,当一个对象(被观察者)改变状态时,它的所有依赖者(观察者)都会收到通知并更新设计原则为了交互对象之间的松耦合设计而努力理解在这个模式中存在两个角色,一个是 “被观察者”,另一个是 “观察者”,他们之间的关系类似现实生活中的“报刊订阅”,其中被观察者是“报社”,观察者是“用户”,用户在报社购买报刊订阅服务后,报社一旦有新报刊发布,就会通知用户,而如果用户

classTC的博客 1330

[网络安全提高篇] 一二九.Powershell恶意代码检测 (5)混淆和反混淆 [上]

前文介绍了如何利用MS Defender实现恶意样本家族批量标注。这篇文章将继续讲解Powershell恶意代码检测,主要包括PowerShell混淆与反混淆内容,首先结合Invoke-Obfuscation工具详细介绍PowerShell代码混淆方法,再结合PowerDecode工具阐述解混淆方法。该研究将为后续的恶意软件家族分类或溯源提供帮助。未完待续,基础性文章,希望您喜欢,且看且珍惜。

杨秀璋的专栏 1542

ThingsBoard集群部署之k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 1175

《测绘综合能力》——大地测量

《测绘综合能力》大地测量 部分重要(常考)知识点(精简版)。

C_xxy's blog 805

《设计模式》学习笔记——观察者模式

        当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。用于定义对象间一对多的关系 意图:     定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:     一个对象状态改变给其他对象通知的问题,而且要考虑到易用和...

smallerxuan的博客 2723

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设计模式学习笔记---观察者模式Observer pattern(Java版)

一、场景网站上,很多人订阅了“NBA主题”新闻,,当有这个主题新闻时,就会将这些新闻发给所有订阅的人。(我们可以把多个订阅者、客户称之为观察者;需要同步给多个订阅者的数据封装到对象中,称之为目标。)二、实质广播机制 观察者主要用于1:N的通知。当一个对象(目标对象Subject或Objservable)<消息发布>的状态变化时,他需要及时告知一系列对象(观察者对象Observer)<消息订阅>,令

吃果冻不吐果冻皮 1217

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

设计模式学习笔记——观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度...

weixin_30708329的博客 78

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【设计模式学习笔记】观察者模式

观察者模式,提供了一种实时监听方案。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。[菜鸟] 文章目录 1.1 被观察者 1.2 观察者 1.3 测试 1.4 结果 参考 当我们的流水线,每生产一辆车,我们都要记录并检验这辆车。 这里的记录员和质检员就是观察者。生产线则是被观察者。当被观察者变化时,就要通知其依赖的这些记录员...

Roger_CoderLife的博客 172

《设计模式》观察者模式 学习笔记

观察者模式 “组件协作”模式: 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 典型模式 •Template Method •Strategy •Observer/ Event 动机: 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(...

sunshine_505的博客 214

设计模式学习笔记--观察者模式

一.简介 观察者模式是一种灰常灰常重要的设计模式!在我们编程的时候经常会用到观察者模式,虽然我们自己可能并不知道。观察者模式又叫做发布-订阅模式。定义了一种一对多的依赖关系,让多个观察者同时监听同一个对象,该对象的状态发生改变时,会通知所有观察者对象,使他们更新自己。 举个例子来说,比如我们在玩一个网络游戏,场景中出现了一个BOSS,那么所有在这个场景中的人都应该能知道BOSS出现了,换句话说

puppet_master的专栏 1109

十、观察者模式——设计模式学习笔记

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

L0nginus的博客 451

《设计模式》学习笔记7——观察者模式

定义观察者模式是使用频率最高的设计模式之一,也是最容易理解的设计模式之一,这种模式在生活中随处可见。 观察者模式引用书中的定义如下: 观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(PublishSubscribe) 模式、模型-视图(Model/View)

程序员涂小哥的技术博客 832

【学习笔记】设计模式之观察者模式

本文是学习李健忠老师的设计模式课程总结的学习笔记 动机 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”–一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好的抵御变化 使用面向对象技术,可以将这种依赖关系弱化,从而实现软件体系结构的松耦合。 场景:文件分割器 需求:提供进度条,显示分割进展 class IProgr...

qq_41612403的博客 171
上一篇: 使用java concurrent处理异步加载图片功能
下一篇: 编写可复用的自定义按钮
GaoJava08
博客等级 码龄18年 201粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值