设计模式——观察者模式(行为型模式)

设计模式 -行为型模式_ 观察者模式Observer Pattern 之 JDK内置的实现 在观察者模式中 - 发生改变的对象叫做观察目标 - 被通知更新的对象称为观察者. 阅读详情

前言:最近一个朋友和我说,当生活变得不顺的时候,她发现坚持太多所谓的原则和底线其实并没有太多的意义,生活最大的意义就是做自己该做的事,喜欢做的事。我也鼓励一个朋友,趁年轻赶紧去想办法搞事情,让一些独一无二的经历使自己变得和别人看起来有那么一丝的不同。

勿问成功的秘诀为何,且尽全力做你应该做的事吧。——美华纳


观察者模式是一个很好将观察者和被观察者解耦的模式,观察者只需要在被观察者中进行注册,告诉被观察者,当你内部数据改变的时候对我进行提醒。

还记得当初刚开始学Android的时候,听说了一个概念叫做回调函数,一直对其不解。现在学习观察者模式,就有一种恍然大悟的感觉,因为观察者模式中就是用了回调函数。

接下来让我们来介绍下我们帅气的观察者模式吧,让我用Head first 设计模式中的一个例子进行举例吧。

比如我们现在有一个观察温度的电子板,它会在温度进行改变的时候获取到改变的温度数值,并显示在温度电子版上。

观察者模式中需要几个类,我们来看看:

  抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

   具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。主题和被观察者是一个概念,在下文中我将使用主题这个词来代替被观察者这个词。

   抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

   具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。


首先,我们来写一个抽象的主题:

<span style="font-family:Microsoft YaHei;font-size:18px;">package com.example.observerpattern;

/**
 * Created by Vicky on 2016/10/28.
 */
//抽象的主题
public interface Subject {
    //观察者可以通过这个方法进行注册
    public void registerObserver(Observer observer);
    
    
    //观察者可以通过这个方法进行解除注册
    public void removeObserver(Observer observer);
    
    
    //这个方法用来通知所有的观察者对象
    public void notifyObserver();
}
</span>

其中你可能会问,这个Observer是什么,这个就是我们的抽象的观察者接口:

<span style="font-family:Microsoft YaHei;font-size:18px;">package com.example.observerpattern;

/**
 * Created by Vicky on 2016/10/28.
 */

public interface Observer {
    //抽象观察者
    public void update(float temperature);
}
</span>

有了抽象的观察者和主题,我们就可以实现他们的具体类了。首先我们来实现主题的具体类:

<span style="font-family:Microsoft YaHei;font-size:18px;">package com.example.observerpattern;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * Created by Vicky on 2016/10/28.
 */

public class WeatherData implements Subject{
    //用来存放所有的观察者对象
    private ArrayList<Observer> observerArrayList;
    private float temperature=0;

    public WeatherData(){
        observerArrayList=new ArrayList<>();
    }
    @Override
    public void registerObserver(Observer observer) {
        //观察者通过调用这个方法进行注册
        observerArrayList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        //观察者通过调用这个方法解除注册
        int index=observerArrayList.indexOf(observer);
        observerArrayList.remove(index);
    }

    @Override
    public void notifyObserver() {
        //通过调用这个方法,通知所有的观察者对象
        Iterator<Observer> iterator=observerArrayList.iterator();
        if (iterator.hasNext()){
            Observer observer=iterator.next();
            observer.update(temperature);

        }
    }
    public void setMeasurement(float temperature){
        //当我们的气温改变的时候,调用notifyObserver()方法,通知所有观察者气温改变了
        if (this.temperature-temperature!=0){
            this.temperature=temperature;
            notifyObserver();
        }

    }
}
</span>
我们定义了WeatherData类实现了抽象的主题接口,实现了registerObserver(),removeObserver(),notifyObserver()方法,供监听者进行注册、解除注册和通知监听者。

接下来我们来看一下我们的监听者具体的实现类:

<span style="font-family:Microsoft YaHei;font-size:18px;">package com.example.observerpattern;

import android.util.Log;

/**
 * Created by Vicky on 2016/10/28.
 */

public class CurrentConditionDisplay implements Observer{
    private Subject weatherData;
    private float temperature;

    public CurrentConditionDisplay(Subject weatherData){
        this.weatherData=weatherData;
        //注册监听,把自己传给主题,其实这里就是运用了回调的知识,当主题的数据改变的时候,主题可以通过传的这个对象进行调用Updata()方法。
        weatherData.registerObserver(this);
    }
    @Override
    public void update(float temperature) {
        this.temperature=temperature;

        Log.d("WeatherData","temperature:"+temperature);
    }
}

</span>

最后我们通过以下代码进行测试一下我们所写的监听者模式是否正常工作了:

<span style="font-family:Microsoft YaHei;font-size:18px;">WeatherData weatherData=new WeatherData();
CurrentConditionDisplay currentConditionDisplay=new CurrentConditionDisplay(weatherData);
weatherData.setMeasurement(80);
weatherData.setMeasurement(77);</span>

打印的内容如下:

10-28 15:33:40.226 29652-29652/com.example.observerpattern D/WeatherData: temperature:80.0
10-28 15:33:40.226 29652-29652/com.example.observerpattern D/WeatherData: temperature:77.0

说明我们的代码正常工作了,当温度改变的时候,我们会通知监听者进行打印改变后的数据。


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

实战指南:如何优雅解决SpringBoot3与Mybatis-Plus的版本兼容性问题 本文深入解析SpringBoot3与Mybatis-Plus的版本兼容性问题,提供实战解决方案。通过Maven依赖排除策略、Gradle配置方案及自动配置覆盖策略,有效解决包冲突和初始化顺序问题,确保项目平稳升级。适用于开发者快速解决SpringBoot3与Mybatis-Plus的集成难题。 阅读详情

相关推荐

DMA学习笔记

DMA(direct memory access,直接内存访问),是一种避开CPU,可以直接对外设和内存进行访问的技术,可以实现外设与内存、内存之间、外设之间的数据的访问和搬移。

weixin_46220498的博客 3113

【行为型模式】观察者模式

观察者模式(Observer)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,其他所有依赖于它的对象都会自动被通知并更新。这个模式也被称为发布/订阅模式。观察者模式通常用于需要实现事件驱动系统的场景中。例如,当用户订阅了一个新闻网站的推送服务后,当这个网站发布了新的文章时,它会将这些更新通知给所有的订阅用户。在这个例子中,订阅用户是观察者,新闻网站是被观察者。观察者模式的好处是减少了对象之间的耦合性,使得它们可以独立地进行修改和扩展。

陈宝子的博客 986

解决mmdet3d安装中因PyTorch高版本引发的THC.h缺失问题

本文详细分析了在安装mmdet3d时,因PyTorch版本过高导致THC.h头文件缺失的常见报错问题。文章指出该错误的本质是PyTorch 1.7+版本废弃了旧API,与老版本C++扩展代码不兼容。提供了两种核心解决方案:一是降级PyTorch至1.6及以下版本;二是修改源码,将THC.h引用替换为ATen/cuda等新头文件,并给出了具体的代码修改示例和排查技巧。

weixin_29085151的博客 379

设计模式-第11章(观察者模式)

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

保持热爱,持续学习 569

K8s入门教程(一)

本教程提供了Kubernetes(K8s)的入门指南,涵盖了从基础概念到实战操作的全面内容。首先介绍了Kubernetes的定义和核心功能,如自动化部署、弹性伸缩、自我修复等。接着,详细讲解了如何在macOS上安装Minikube和kubectl工具,以及如何使用这些工具创建和管理Pod、Deployment和Service等核心资源。教程还包括了实战案例,如部署Nginx应用,并介绍了高级特性如滚动更新和自动伸缩。最后,提供了常见问题的解决方案,帮助用户快速上手和解决实际使用中的问题。

2401_82505179的博客 1689

Triton推理服务器实战:如何为PaddleOCR的ONNX模型配置动态批处理和并发推理

本文详细介绍了如何使用Triton推理服务器为PaddleOCR的ONNX模型配置动态批处理和并发推理,以提升GPU利用率和推理性能。通过实战案例和参数调优指南,帮助开发者解决高并发场景下的性能瓶颈问题,实现从实验室到生产环境的高效部署。

weixin_42527160的博客 426

观察者模式

介绍 定义 观察者模式又叫做发布-订阅模式,模型-视图模式。 观察者模式属于行为型模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 理解 观察者模式完美的将观察者和被观察的对象分离开。举个常见的例子,前阵子由于总是突发性高烧去医院检查,肯定得排队哈,不能隔两分钟...

weixin_30809333的博客 191

使用HART Server PC软件进行HART设备的组态、调试和分析的完整指南

HART协议是一种用于工业自动化中的双向通信协议,能够在4-20mA模拟信号的基础上叠加数字信号,从而实现设备的远程监控和管理。HART协议兼具模拟和数字通信的优点,被广泛应用于过程控制系统中。设备组态:通过软件可以对HART设备进行组态,配置设备参数。设备调试:支持设备的在线调试和故障诊断,方便快速解决问题。数据分析:提供设备运行数据的实时监控和历史数据分析功能。报表生成:支持生成各类报表,便于数据记录和管理。

qq_38334677的博客 2469

行为型模式(七):观察者模式

一、模式的定义与特点 观察者(Observer)模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 这种模式又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。 观察者模式是一种对象行为型模式,其优点如下: 1、降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。 2、目标与观察者之间建立了一套触发机制。 缺点: 1、目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。 2、当观察者对象很多时,通知的发布会花费很多时间,影

kayyoo的博客 495

水声信号处理开源算法库最新进展

欢迎关注本专栏,一起探索新世界大家好,我是ZhuChunSHU。985院校硕士毕业,现担任算法研究员一职,热衷于深度学习算法研究与应用。曾获得阿里云天池比赛第三名,CCE比赛第五名,科大讯飞Q比赛第六名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法行业就业。希望和大家一起成长进步。今天继续我们的专栏分享!!!!!!!!!!!!!!!!!!!!水声信号处理是海洋科学与工程领域的核心组成部分,对于水下通信、目标探测、海洋环境监测以及生物声学研究至关重要。

u012133341的博客 1254

宇树G1开发实践--PPT汇报(基础版)

本文介绍了一套基于宇树G1人形机器人的PPT自动演示系统,可实现"一键启动、自动演讲"功能。系统通过多线程同步技术,将音频播放与机器人动作完美结合,支持12种预设社交互动动作。硬件依赖宇树G1机器人、外接音响和网络连接,软件采用Python SDK和ALSA音频工具。核心功能包括音频文件自动排序、外接音响播放控制、机器人动作执行及音画同步。使用时需配置网络接口和音频设备号,运行后自动按顺序播放音频并执行随机动作。系统特别强调了安全注意事项,并提供了常见问题解决方案,适用于展会、汇报等需要

m0_47999117的博客 510

观察者模式(Observer Pattern)是一种常用的设计模式,属于行为型模式

- **主题(Subject)**:也称为被观察者。它是一个接口,用来注册和移除观察者对象,并且在状态改变时通知所有观察者。 - **具体主题(ConcreteSubject)**:实现了主题接口,维护了一个内部状态,并且在状态改变时通知所有注册的观察者。 - **观察者(Observer)**:一个接口,定义了一个更新接口,用于接收主题的通知。 - **具体观察者(ConcreteObserver)**:实现了观察者接口,存储了一个指向具体主题的引用,并且在收到通知时更新自己的状态。

[Blog][Domain] programb.blog.youkuaiyun.com 1345

三维重建/SLAM笔记_最佳学习路线/攻略

本文目的 学习三维重建,需要不少知识,而知识之间又存在不同的依赖关系,为了后来人能少走弯路,也为了对自己的知识框架系统总结,特记录自己的学习路线。 学习心得 关于读书,了解基础知识是一方面,产生疑问也是一方面,为以后知道学习什么留下印象; 一回生,二回熟,看不懂时,大多是因为先验知识不够,没关系,多查多想,总会搞懂的。 学习路线 1.计算机图形学基础(OpenGL基础版)(徐文鹏 清...

惊鸿一博 3291

设计模式——行为型——观察者模式ObserverPattern

https://en.wikipedia.org/wiki/Observer_pattern

bbllbbcpt的专栏 304

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【设计模式精讲】行为型模式之观察者模式

观察者模式的应用场景非常广泛,小到代码层面的解耦,大到架构层面的系统解耦,再或者 一些产品的设计思路,都有这种模式的影子.现在我们常说的基于事件驱动的架构,其实也是观察者模式的一种最佳实践。当我们观察某一个对象时,对象传递出的每一个行为都被看成是一个事件,观察者通过处理每一个事件来完成自身的操作处理。生活中也有许多观察者模式的应用,比如 汽车与红绿灯的关系,‘红灯停,绿灯行’,在这个过程中交通信号灯是汽车的观察目标,而汽车是观察者.

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

行为型设计模式—观察者模式(Observer Pattern)

观察者模式(Observer Pattern)是一种行为型设计模式,用于建立一种一对多的依赖关系,以便当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这个模式通常用于实现发布-订阅系统。:客户端代码创建了一个具体主题和两个具体观察者,将观察者注册到主题中,并在主题状态变化时通知观察者。最后,它演示了如何从主题中注销观察者。接口,并维护一个观察者列表。它在状态改变时会通知所有观察者。方法,用于管理观察者列表和通知观察者。接口,并在接收到更新时进行处理。方法,用于接收主题的更新。

Fanjufei的博客 493

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【C#设计模式】16.观察者模式(Observer Pattern)【行为型】

1.1 动机(Motivate) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 1.2 意图(Intent) 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。       ——《设计模式》GoF

星Yeah 的博客 3286

C# 设计模式:第十五章 - 行为型模式 之 观察者模式(Observer Pattern)

观察者模式是一种行为型设计模式,它允许你定义一种一对多的依赖关系。在这种模式下,一个或多个“观察者”对象会订阅一个“被观察者”对象。当被观察者的状态发生变化时,它会自动通知所有的观察者,观察者们可以相应地做出反应。这种模式非常适合用于实现事件驱动的系统,比如 GUI 程序中的按钮点击事件、天气预报系统的更新等。在这章中,我们学习了观察者模式的基本概念、应用场景、实现方法以及注意事项。观察者模式允许你定义一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。事件驱动系统。

caifox的博客 1367

c++ 设计模式_设计模式行为型:观察者模式(ObserverPattern)

定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependence)模式。结构图角色与理解观察者模式共分为四种角色: Subject(目标类):被观察的对象,内部定义一个观察者集合,并...

weixin_39974223的博客 110

设计模式-13-观察者模式(上)-行为型模式

我们常把23种经典的设计模式分为三类:创建型、结构型、行为型。前面我们已经学习了创建型和结构型,从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主要解决“对象的创建”问题,结构型设计模式主要解决“类或对象的组合或组装”问题,那行为型设计模式主要解决的就是“类或对象之间的交互”问题。行为型设计模式比较多,有11个,几乎占了23种经典设计模式的一半。它们分别是:观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。

helloworld_9的博客 649

行为型设计模式: 观察者模式(Observer Pattern)

设计模式;行为型模式;观察者模式(Observer Pattern): 定义对象间的一种一对多的依赖关系, 当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 观察者模式(Observer Pattern)属于行为型模式。行为型模式涉及到算法和对象间职责的分配;行为型模式不仅描述对象或类的模式,还描述它们之间的通信模式。行为型模式刻划了在运行时难以跟踪的复杂的控制流;它们将你的注意力从控制流转移到对象间的联系方式上来。

智能多媒体 412

设计模式(十八):行为型之观察者模式

定义又被称为发布-订阅(Publish/Subscribe)模式它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

从基础到源码解析的学习记录 2159

[设计模式] 行为型:观察者模式(Observer Pattern)

文章目录什么是观察者模式设计与实现主动观察者模式被动观察者模式 什么是观察者模式 顾名思义,观察者就是要对目标进行观察,当目标行为有所变动时,自己及时作出反应。 观察的具体方法有很多种,从编程的角度来理解,观察者要达到观察的目的,主要有两种策略: 观察者主动观察目标状态,实时或半实时的对目标对象进行监听,属于面向过程的编程思想 观察者被动接收消息,当目标状态发生改变时,目标对象主动通知观察者,属于面向对象的编程思想 我将第一种策略称之为主动观察者模式,第二种策略称之为被动观察者模式,名字是我随便取的,读

不忘初心 方得始终 1128

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 观察者模式(Observer) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 观察者模式(Observer) 1、当一个对象(被观察)变化时,其它关联对象(观察者)都会随着变化! 2、关联关系:一对多;(一是被观察对象,多是观察者)一、说明: 1、Observer 观察者(接口); 2、Guardian 观察者.实现类; 3、Watched 被观察(接口); 4、

Z 853

【设计模式】行为型模式—观察者模式(Observer Pattern)(十六)

**观察者模式(Observer Pattern)又称为`发布/订阅(Publish/Subscribe)模式,`在对象之间定义了一对多的依赖关系,当一个对象改变状态,依赖它的对象会收到通知并自动更新.** - 观察者模式无外乎2个操作,观察者订阅自己关心的`主题(Subject)`和`主题有数据变化后通知观察者们`。 - 核心:`那就是一定有一个地方存放了所有的观察者,然后在事件发生的时候,遍历观察者,调用它们的回调函数。` - 实际生产过程中,观察者模式往往用`消息中间件来实现`,如果要实现**单机观察

墩墩分墩 659

设计模式快速入门——行为型模式之观察者模式(Java)

本文将快速入门行为型模设计模式中的观察者模式。观察者模式是一种行为型设计模式,它建立了一种对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其所有依赖对象都会自动收到通知并进行相应的更新。这种模式中,主题是被观察的对象,而观察者是依赖主题状态的对象。

吾家有猫名探花的博客 239
上一篇: 设计模式——单例模式(创建型模式)
下一篇: 设计模式——装饰者模式(结构型模式)
VikcyWinner
博客等级 码龄11年 12粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值