设计模式学习笔记十一:观察者模式

DesignPattern 设计模式学习笔记(面试和工作必备) 最近有很多粉丝留言:“学设计模式有什么用啊,好像我工作中都用不到设计模式,但每次面试都要问实际项目中使用了哪些设计模式,我都答不上来。” 面对这样的问题,我想说设计模式真的很重要。曾经我也认为学设计模式没什么用,但用过了都说好。所以,猿人花了一个星期的时间给大家整理了最常用的设计模式,通过源码和文档的形式分享给大家。 希望大家认真学习掌握,真正学以致用。不仅面试时要对答如流,实际工作中也要加以应用,这样能力才会得到提升。 一、设计模式介绍 设计模式(Design pattern)代表了最佳的实践,通常被有经 阅读详情

设计模式学习笔记十一:观察者模式

介绍

观察者(observer)模式也叫发布-订阅模式,实现了观察者和被观察者的解耦操作,观察者可以根据自身需求选择关注哪些主题和取消关注哪些主题,当主题发生变化的时候会轮询通知观察者,所以主题和观察者之间是一对多的关系。

典型应用

  • MQ
  • AWT事件监听
  • NIO多路复用
  • ……

UML结构图:

observer

代码实现:

1.主题接口

package com.array7.observer;

public interface Subject<T> {
    /**
     * 创建观察者
     * @param observer
     */
    public void add(Observer<T> observer);

    /**
     * 删除观察者
     * @param observer
     */
    public void remove(Observer<T> observer);

    /**
     * 轮询通知观察或者
     */
    public void notifyObservers();
}

2.具体主题实现

package com.array7.observer;

import java.util.HashSet;
import java.util.Set;

/**
 * 具体的主题,即被观察者
 */
public class ConcrectSubject implements Subject<String> {
    private Set<Observer<String>> observers;

    private String changeData;

    public ConcrectSubject() {
        observers = new HashSet<Observer<String>>();
    }

    @Override
    public void add(Observer<String> observer) {
        observers.add(observer);
    }

    @Override
    public void remove(Observer<String> observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer<String> observer : observers) {
            observer.update(this.getChangeData());
        }
    }

    public String getChangeData() {
        return changeData;
    }

    /**
     * 触发update操作的方法
     */
    public void setChangeData(String changeData) {
        this.changeData = changeData;
        notifyObservers();
    }

}

3.观察者接口

package com.array7.observer;

/**
 * 观察者接口
 * @param <T>
 */
public interface Observer<T> {
    /**
     * 状态更新通知
     * @param t
     */
    public void update(T t);

    /**
     * 主题已经存在了一个remove(..)方法,依然可以提供一个取消订阅的方法(可选)
     * 为了区分这里名称定义为了quit()
     */
    public void quit();
}

4.具体观察者实现

package com.array7.observer;

/**
 * 具体的观察者
 */
public class ConcrectObserver implements Observer<String>, BizService<String> {
    private Subject<String> subject;

    public ConcrectObserver(Subject<String> subject) {
        subject.add(this);
        this.subject = subject;
    }

    @Override
    public void update(String str) {
        // logic
        dosmth(str);
    }

    @Override
    public void dosmth(String str) {
        System.out.println(Thread.currentThread().getName() + ":" + str);
    }

    @Override
    public void quit() {
        subject.remove(this);
    }
}

5.其他业务逻辑组合

package com.array7.observer;
/**
 * 强制在观察者具体实现类实现此方法
 */
public interface BizService<T> {
    public void dosmth(T t);
}

6.Run

package com.array7.observer;

/**
 * 运行类
 */
public class Run {
    public static void main(String[] args) {
        ConcrectSubject subject = new ConcrectSubject();
        // 初始化一个观察者
        new ConcrectObserver(subject);
        subject.setChangeData("abcd");
        subject.setChangeData("1234");

        ConcrectObserver tmpObserver = new ConcrectObserver(subject);
        subject.setChangeData("dcba");
        // 删除这个观察者
        subject.remove(tmpObserver);

        // 新加入的观察者,我们预计会输出两次4321 :]
        new ConcrectObserver(subject);
        subject.setChangeData("4321");
    }
}

TIPS

在JDK中也提供的观察者模式的实现,但是JDK中的观察者接口是使用抽象类实现的。这就意味着如果想使用JDK中自带的实现,就不能再继承其他的基类了。而如果在基类继承,代码耦合度又会上来,因为可能不是所有的类都需要使用观察者。能用接口,尽量不用继承,也是设计原则之一:多用组合,少用继承。

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

相关推荐

Oracle数据库安装及配置(Oracle19c)

Windows 10安装Oracle 19c教程

weixin_69200200的博客 2万+

设计模式DesignPattern【1】

设计模式是对于反复出现的问题的解决方案,是关于如何解决某些问题的指南。它们不是可以插入应用程序中的类、包或库。相反,这些是关于如何在某些情况下解决某些问题的指导方针,是一种思想方面的东西。设计模式是软件设计中常见问题的典型解决方案。它们就像预制的蓝图,你可以对其进行自定义以解决代码中反复出现的设计问题。

2301_80272161的博客 1108

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1093

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

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

灵台方寸山斜月三星洞 557

关于RTP时间戳以及播放器对时间戳的处理

首先,了解时间戳几个基本概念: 时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000。 时间戳增量:相邻两帧之间的时间差(以时间戳单位为基准)。 采样频率: 有些地方也叫时钟频率,即 每秒钟抽取样本的次数,例如音频的采...

toshiba689的专栏 3052

告别BAPI!深入SAP S/4HANA BP框架:cl_md_bp_maintain维护客户主数据的正确姿势与性能优化

本文深入解析SAP S/4HANA中cl_md_bp_maintain框架的高效实践与架构设计,对比传统BAPI方式,展示其在业务伙伴(BP)主数据维护中的性能优势与现代化特性。通过详细代码示例和性能测试数据,揭示如何利用该框架实现批量处理、集中校验及智能错误恢复,助力企业从ECC向S/4HANA平滑迁移。

weixin_30596735的博客 361

设计模式——观察者模式

《Head First 设计模式》 学习笔记,码云同步更新中 如有错误或不足之处,请一定指出,谢谢~ 往期回顾 设计模式——策略模式 设计模式——装饰者模式 设计模式——观察者模式 观察者模式 定义: 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新 结构: Subject:主题接口 ConcreteSubject:具体主题 Obs...

TrZoey的博客 302

Mediatek NeuroPilot Yolov8量化

【代码】Mediatek NeuroPilot Yolov8模型转化。

sdrgtywretyeruet的专栏 348

设计模式之观察者模式

Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically. 文章目录定义观察者模式的优缺点应用Java中的观察者模式发布/订阅模型 定义 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。 观察者通用类图: Subject被.

Eamon 806

LIN协议V2.2A版介绍

IN 协议规范2.2A 版(2010 年 12 月发布)是面向低成本汽车网络的标准,核心采用单主多从架构,支持最高20kbit/s速率,通过单总线实现通信;定义了完整的协议栈(含协议层、传输层、物理层等),规定了帧结构(含 Break 字段、Sync 字节、保护标识符 PID、数据字段、校验和)、5 类帧类型(无条件帧、事件触发帧等)及调度表机制以保障确定性传输;

qflook的博客 320

基于Harness Engineering构建AI Agent的全自动化CI_CD流水线

AI Agent的CI/CD是指对Agent的全生命周期资产(代码、Prompt、RAG知识库、模型权重、工具配置)进行持续集成、持续测试、持续发布和持续观测的自动化流程,核心目标是在保障发布质量的前提下,最大化提升Agent的迭代效率。

AI云原生与云计算技术学院 625

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

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

puppet_master的专栏 1109

【树莓派安装Homeassistant及基本配置】

时隔一年,我又重新开始玩Homeassistant,发现其中奥妙无穷,惊喜不断。在我浅薄的认知中要学好嵌入式,必须玩过Homeassistant,并且玩出自己的名堂!因为这是最贴切实际的生活应用没有之一,每月更新使得唯有活水来;拥抱大千使得永葆青春的活力;鬼斧神工的操作精彩纷呈,可以堪称软件与硬件的完美落地!

vor234的博客 1万+

设计模式学习笔记 - 设计模式与范式 -行为型:17.中介模式:什么时候用中介模式?什么时候用观察者模式?

前面讲观察者模式的时候,我们讲到观察者模式的实现方式有很多种。虽然经典的实现方式没法彻底解耦观察者和被观察者,观察者需要注册到被观察者中,被观察者状态更新需要调用观察者的update()方法。但是在跨进程的实现方式中,我们可以利用消息队列实现彻底解耦,观察者和被观察者都只需要跟消息队列交互,观察者完全不知道被观察者的存在,被观察者也完全不知道观察者的存在。本章提到,中介模式也就为了解耦对象之间的交互,所有的参与者都只与中介进行交互。

chenjian723122704的专栏 1247

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

javascript 设计模式(观察者模式)

本系列文章来源于《Javascript设计模式》(张容铭版),做一个记录。 最近在学习《Javascript设计模式》一书,对学习过程做一个笔记总结。系列文章大家可以关注我的个人博客会不定时更新,大家一起学习一起进步。 概念 观察者模式:又称为发布-订阅者模式或者消息机制(妈蛋叫什么不重要主要是理解意思)。 首先我们需要把观察者创建出来,观察者模式有三部分, 消息容器 订阅消息方法 取消订阅的消...

weixin_34138377的博客 200

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

图说设计模式:观察者模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

cf18862344377的博客 1195

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

设计模式学习笔记 - 设计模式与范式 -行为型:1.观察者模式(上)

设计模式要干的事情就是解耦,创建型模式是将创建和使用代码解耦,结构性模式是将不同功能代码解耦,行为性模式是将不同行为解耦,具体到观察者模式,它将观察者和被观察者代码解耦。借助设计模式,我们利用更好的代码结构,将一大坨代码拆分成职责更单一的小类,让其满足开闭原则、高内聚低耦合等特性,依此来控制和应对代码的复杂性,提高代码的可扩展性。

chenjian723122704的专栏 1820

设计模式之二:观察者模式

《Head First设计模式》第二章学习笔记 一、OO基础:      抽象 二、OO原则:      为交互对象之间的松耦合设计而努力 三、观察者模式       观察者模式,又叫发布--订阅模式、模型--视图模式、源--监听器模式或从属者模式。观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。主

caihaijiang的专栏 1568

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

最近学习比较迷茫,不知道学点什么好。正好昨天项目组的技术分享会讲了设计模式,于是决定继续学习一下设计模式。 本篇文章记录了我对观察者模式的理解,如果有偏差,期待指正_ 一、观察者模式介绍 观察者模式是设计模式中行为模式的一种。当对象间存在一对多的依赖关系时,被依赖的对象发生了变化,要求依赖它的所有对象都要做出相应的变化或动作,那么被依赖的对象就是被观察者(主题对象),依赖这个对象的其它对象被称为观察者。 二、设计实现 需

爱辰 550

Golang学习笔记_41——观察者模式

Golang学习笔记_38——享元模式 Golang学习笔记_39——策略模式 Golang学习笔记_40——模版方法模式观察者模式是一种行为型设计模式,建立对象间的一对多依赖关系,当一个对象(主题)状态改变时,自动通知所有依赖对象(观察者)。其核心特点包括: 二、特点分析 优点缺点 2. 物联网设备状态监控 3. 电商订单状态通知 四、Go语言实现示例 执行结果 五、高级应用 1. 异步通知机制(参考网页10) 2. 事件过滤机制 六、与其他模式对比 模式 核心区别 典型场景

LuckyLay的博客 1447

游戏设计模式学习笔记(4)观察者模式

游戏设计模式学习笔记(4)观察者模式 参考: 《设计模式与游戏完美开发》 《游戏编程模式》(https://github.com/tkchu/Game-Programming-Patterns-CN) 《图说设计模式( Graphic Design Patterns)》(https://github.com/me115/design_patterns) 【游戏设计模式】浅墨_毛星云: https...

l773575310的博客 388

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

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

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

【观察者模式】 ——每天一点小知识

🐬观察者模式是一种有用的设计模式,它能够实现对象之间的一对多依赖关系,当一个对象的状态发生改变时,其所有依赖者都会得到通知并自动更新。通过观察者模式,我们可以实现松耦合的对象间通信,提高代码的灵活性和可维护性。

仰望天空,妳我亦是行人. 2300

《设计模式之美》观察者模式(上):详解各种应用场景 下观察者模式的不同实现方式

王争《设计模式之美》学习笔记 行为型设计模式主要解决的就是“类或对象之间的交互”问题。 一个行为型设计模式,也是在实际的开发中用得比较多的一种模式:观察者模式。 观察者模式会对应不同的代码实现方式: 有同步阻塞的实现方式,也有异步非阻塞的实现方式; 有进程内的实现方式,也有跨进程的实现方式。 原理及应用场景剖析 观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subscribe Design Patter)。 在对象之间定义一个一对多的依赖,当一

玲珑巫女的学习笔记 282

【学习笔记】设计模式Day1

设计模式 模板方法 观察者模式

qq_62883320的博客 1051
上一篇: 【亲述】Uber容错设计与多机房容灾方案 - 高可用架构系列
下一篇: 设计模式学习笔记十二:访问者模式
七郎
博客等级 码龄14年 31粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值