技术成神之路:设计模式(九)观察者模式

altium room 布局_ALtium 16相同重复模块PCB布局,复制布局走线 自己做了实际工程以后发现PCB器件名字后缀太长了,所以文章最后写了一下后缀的调整方法。第一种方法:1、建立子原理图如下,文件名CANM 2、之后新建一个顶层文件,文件名TOP,之后design—create sheet symbol form sheet or hdl。选择CANM,并放置到TOP中,如下 3、由于我们要多次调用CANM所以使用repeat命令修改如下: 4、之后根据自己的定义,连... 阅读详情

相关文章:技术成神之路:二十三种设计模式(导航页)

介绍

观察者模式(Observer Pattern)是一种行为设计模式。它允许一个对象(称为主题或可观察者)来监视并通知一组依赖于这个对象的其他对象(称为观察者),以便在主题状态发生变化时自动更新观察者的对象。

1.定义


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

2.主要作用


主要作用是解耦主题与观察者之间的耦合关系,使得主题和观察者之间可以轻松地进行交互和通信。

3.解决的问题


  • 对象间的依赖关系管理:将对象间的依赖关系从静态写死的调用关系解耦,通过抽象出观察者接口和主题接口来管理对象间的关系。

  • 通知机制:当一个对象的状态发生变化时,需要通知其他相关的对象做出相应的改变,观察者模式提供了一种灵活的通知机制。

观察者模式应该是我们在开发中使用最频繁的一个设计模式了,比如在安卓中经常用到的:

  1. LiveData 和 Observer:LiveData 是一种在 Android 应用中生命周期感知的可观察数据持有类。可以存储数据,并在数据发生变化时通知其观察者。通常与 Observer 结合使用。
  2. BroadcastReceiver 和 IntentFilter:广播发送者和接收者之间的通信机制可以看作是一种观察者模式的实现。
  3. RxJava 和 Observer:提供了 Observables 和 Observers 的概念,可以用来实现观察者模式。

注意 观察者模式的定义是一对多的关系,像监听事件只能算回调(Callback),不严格符合传统的观察者模式的定义!

4.模式原理


包含角色:

  • Subject(主题):维护一组观察者对象,提供注册和删除观察者对象的接口。主题对象状态发生变化时,调用观察者的相应方法。

  • Observer(观察者):定义一个更新接口,使得在主题对象状态改变时能够得到通知和更新。

  • ConcreteSubject(具体主题):将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。

  • ConcreteObserver(具体观察者):维护一个指向具体主题对象的引用,存储与主题的状态相对应的信息。实现 Observer 定义的更新接口,以便使自身状态与主题的状态保持一致。

UML类图:
在这里插入图片描述
示例代码:

主题接口 Subject

import java.util.ArrayList;
import java.util.List;

// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具体主题类
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
}

观察者接口 Observer

// 观察者接口
interface Observer {
    void update(int state);
}

// 具体观察者类
class ConcreteObserver implements Observer {
    private int observerState;

    @Override
    public void update(int state) {
        observerState = state;
        System.out.println("Observer state updated: " + observerState);
    }
}

使用

public class ObserverPatternExample {
    public static void main(String[] args) {
        // 创建具体主题对象
        ConcreteSubject subject = new ConcreteSubject();

        // 创建具体观察者对象
        ConcreteObserver observer1 = new ConcreteObserver();
        ConcreteObserver observer2 = new ConcreteObserver();

        // 注册观察者
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);

        // 改变主题状态,并触发通知
        subject.setState(10);

        // 移除一个观察者
        subject.removeObserver(observer1);

        // 再次改变主题状态,并触发通知
        subject.setState(20);
    }
}

打印

Observer state updated: 10
Observer state updated: 10

Observer state updated: 20

上面举例为标准的观察者模式写法,我记得在上家公司代码中 有一种奇怪的写法,当然,也符合观察者模式定义。

在安卓中不同组件之间大多都有传递消息的需求,大家常用的库有EventBus吧。简单,方便,它是定义了一个 IHandler类,其中代码 就像上面 ConcreteSubject 类中差不多,只不过多了一个Handler 就是为了方便切换线程的,保证观察者收到的消息都是在主线程中,注意他是一个类,不是接口,而且所有代码都在IHandler 类中,谁继承它 就是 具体主题类 ,因为安卓是单继承嘛,这个使用起来很不方便。

无论你在任何地方,想要得到这个 具体主题类的消息,只需要向它注册观察者即可,当然最后别忘了反注册,不然要内存泄漏了,刚用的时候稍不留意就忘了,可恶心,当然 这个具体主题类 一般都是单例,全局唯一对象,因为当时是霸屏应用(特殊场景),所以单例满天飞,用的时候可爽,哈哈哈,现在回想起来都是问题。

5.优缺点


优点:

  • 解耦性:主题和观察者之间是抽象耦合,容易扩展。
  • 支持广播通信:主题可以通知多个观察者,观察者也可以接收多个主题的通知。
  • 灵活性:可以动态地设置通知方式和观察者的添加和删除。

缺点:

  • 可能引起循环调用:如果观察者和主题之间的依赖关系设计不当,可能导致循环调用。
  • 通知效率:如果通知过于频繁,可能会影响系统性能,一般场景这个问题不用考虑的,但如果你的观察者好多个甚至几十上百的话 就不得不考虑效率问题了。

6.应用场景


  1. 当一个抽象模型有两个方面,其中一个依赖于另一个。
  2. 当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要改变时。
  3. 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。

7.总结


观察者模式通过定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,实现了对象之间的解耦和通信。它是实现事件驱动程序设计的基础,广泛应用于GUI(Graphical User Interface,图形用户界面)开发、事件处理系统等需要高内聚、低耦合的场景中。

Flink 作业报错——TaskManager连接不上 阅读详情

相关推荐

第十九届全国大学生智能车竞赛越野信标 硬件篇

全国大学生智能汽车竞赛,越野信标组

2301_77568650的博客 4115

android观察者模式的作用,Android设计模式(十一)-观察者模式

观察者模式是一种使用频率非常高的设计模式,最常用的地方就是订阅-发布系统。这个模式的重要作用就是将观察者和被观察者解耦,使他们之间的依赖更小甚至没有。定义定义对象一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于他的对象都会得到通知并被自动更新。使用场景关联行为场景,这个关联是可拆分的。将观察者和被观察者封装在不同的对象中,可以各自独立的变化。当一个对象改变时,有其他对象要进行相应的变化...

weixin_35662528的博客 209

【PADS-开发指南】

馒头破戒大师

sinat_23896491的博客 3215

观察者模式

介绍 观察者模式是一个使用率非常高的模式,这个模式的一个重要作用就是将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。 定义 观察者模式定义对象间一种一对多的依赖关系,使得当每一个对象改变状态时,则所有依赖于它的对象都会得到通知并被自动更新。 使用场景 (1)关联行为场景,需要注意的是,关联行为是可拆分的,而不是组合关系 (2)事件多级出发场景 (3)跨系统的消息...

Rain_9155的博客 1748

汇编语言与USB量产工具开发解析

本文解析了汇编语言在USB量产工具开发中的应用。USB量产工具主要用于批量配置USB设备,包括固件烧录、格式化、信息写入等功能。汇编语言在底层硬件操作中发挥关键作用,如直接控制USB寄存器、编写驱动和精确时序控制。文章通过伪代码示例展示了USB控制器初始化和固件烧录流程,并强调硬件依赖性、安全机制和时序精度等注意事项。开发需严格遵循芯片手册,建议优先使用厂商SDK,避免设备损坏风险。

RulesChen的博客 1024

SAP 的预算控制并非单一功能,而是根据管控的精细度和业务场景,主要通过三个模块实现:CO(成本控制)、FM(基金管理) 和 PS(项目系统)

SAP系统提供三种预算控制模型:基于CO模块的成本中心/内部订单预算管控,适用于日常费用管理;基于FM模块的基金中心/承诺项目预算控制,满足公共部门严格资金管理需求;基于PS模块的WBS元素预算控制,专为项目型企业设计。各模型通过特定配置实现预算编制、审批、控制和分析功能,并配有核心事务代码(T-Code)支持全流程操作。企业可根据业务场景选择适合的预算控制方式,实现从预算编制到执行监控的闭环管理。

金牌架构师 251

(设计模式十三)java设计模式之观察者模式

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

IT-HotBoy的博客 880

人工智能智能体研究综述:从理论架构到前沿应用

AI Agent,即人工智能智能体,是指能够在特定环境中自主感知、推理、决策并执行行动以实现特定目标的智能系统[1]。自主性反应性主动性(Pro-activeness)和社会性fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;AI Agent核心特征自主性 Autonomy反应性 Reactivity主动性 Pro-activeness。

nmdbbzcl的博客 902

浅谈为什么设计模式要有观察者模式--观察者模式的意义

2019年10月12日04:08:46 设计模式不是解决业务逻辑问题, 而是为了解决开发管理的一种规范思路, 所以两年前我的例子是错误的, 如有读者建议直接去看一些视频老师的讲解, 此处留着警示自己! _______________________________________________________________________________________________ ...

houzhyan-博客 1万+

Asterisk中MixMonitor之支持接通后录音

一、概述 当我们使用开源的IPPBX(比如Elastix-2.5/4.0或者ISSABEL-4.0/FreePBX)的时候Outbound和Inbound路由(RingGroup/FollowMe)中有一个Call Recording选项,其值包括:Allow、Record immediately、Record On Answer和Nerver。当选择为Record On Answer,其实就是MixMonitor自带一个b选项。 尽管Asterisk自带的MixMoni...

宽简厚重—博约 1156

[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster原理详解

Web渗透技术的核心是发现Web漏洞,发现漏洞有手工和软件自动化扫描两种方式。对于用户验证漏洞、用户凭证管理问题、SQL注入等常见Web漏洞,都可以通过Web扫描器进行扫描。各个扫描器的功能和结果都不同,常见的包括HScan、HScan、X-Sccan、Acunetix Web Vulnerability Scanner、Jsky、Router Scan扫描工具等。本文主要讲解三个常见的Web漏洞扫描工具,分别是NMapp、ThreatScan和DirBuster。希望这篇基础性文章对你有所帮助.

杨秀璋的专栏 1万+

gpio的8种工作模式_Java成神路上之设计模式系列教程之一

Java成神路上之设计模式系列教程之一千锋-Feri在Java工程师的日常中,是否遇到过如下问题:Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式?什么是设计模式?你是否在你的代码里面使用过任何设计模式?解释下什么是观察者模式?使用工厂模式最主要的好处是什么?在哪里使用?等等相关的问题,那么问题来了,究竟什么是设计模式,它与我们又有什么关系?在我们的日常开发中充当什么样的作用?...

weixin_39739404的博客 102

uniapp - 解决在线预览PDF文件空白打不开的问题,无论是后端下载二进制文件流pdf还是本地插件或JS预览查看打开白屏不显示,详细排查解决(适用于移动端H5网页、安卓/苹果app、微信小程序)

uniapp App端 实现pdf文件预览打开白屏解决,uniapp 在线预览pdf打开一片空白,跨域白屏,uni-app中使用WebView预览PDF文件打开空白,微信小程序(uniapp)预览PDF空白怎么办,下载PDF文件流后打开空白或无法打开的问题,Uniapp H5网页下载二进制pdf文件页面空白以及解决文件损坏打不开的情况,Uniapp app在线预览pdf文件流,PDF加载出来怎么办,服务器后端返回PDF文件流后前端进行下载但打开后一片白屏,解决pdf文件流,预览全是空白页,pdf文件流,下载

🏆 前端领域优质创作者 1万+

Java成神路上之设计模式系列教程之一

Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在你的代码里面使用过任何设计模式? 解释下什么是观察者模式? 使用工厂模式最主要的好处是什么?在哪里使用? 等等相关的问题,那么问题来了,究竟什么是设计模式,它与我们又有什么关系?在我们的...

qfchenjunbo的博客 130

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

CMap分子指纹搜索引擎:从基因表达向量到药物重定位

CMap(Connectivity Map)是一种基于基因表达谱的高维生物信息检索系统,其核心是将化合物转化为978个标志性基因的z-score向量,通过线性代数运算(如加权余弦相似度)实现跨扰动条件的生物学关联匹配。它不依赖SQL或传统数据库架构,而是以HDF5张量格式存储、以L1000平台标准化数据为基石,支撑药物重定位、通路机制解析与多组学验证等关键科研任务。作为药理学与计算生物学交叉的典型范式,CMap已成为小分子功能注释、老药新用发现及单细胞数据解读的重要基础设施,广泛应用于抗纤维化、抗肿瘤及炎症

weixin_34411563的博客 405

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

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

设计模式学习第一天:从入门到放弃还是到成神

此外,你还可以阅读《Head First 设计模式》等轻松易懂的书籍,它们通过生动的插图和有趣的案例来帮助你理解设计模式。它描述了在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用,以及它们各自的职责和协作方式。设计模式是在软件开发中常见的问题和解决方案的总结,它们提供了可重用的设计,帮助开发者提高代码的可读性、可维护性和可扩展性。总之,学习设计模式需要付出一定的努力和时间,但只要你坚持不懈地学习和实践,就一定能够掌握它们并提高自己的编程能力。

s8305057的博客 471

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

522还不知道怎么表白吗?——经典设计模式之【观察者模式】

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版) ②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版) ③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版) ④【Web前端】从HT...

黑技的博客 360

技术成神之路:二十三种设计模式(导航页)

设计原则/模式 链接 面向对象的六大设计原则 技术成神之路:面向对象的六大设计原则 创建型模式 单例模式 建造者模式 原型模式 工厂方法模式 抽象工厂模式 行为型模式 策略模式 状态模式 责任链模式 观察者模式 备忘录模式 迭代器模式 模板方法模式 访问者模式 结构型模式 享元模式 中介者模式 代理模式 组合模式 适配器模式 桥接模式 装饰模式 外观

WriteBug001的博客 587

程序员成神之路

程序员的成长路径是一个多元化和层次化的过程,涵盖了从初级开发者到技术领导者的多个阶段。以下定义了程序员成长的关键路径和里程碑。:通常指刚入行的程序员,他们对编程语言和工具有基本的了解,能够完成一些简单的编码任务。在这个阶段,重点是掌握编程基础和开发工具的使用。:中级程序员已经具备了一定的项目经验,能够独立完成模块开发,并开始理解软件设计的基本原则。他们开始学习更高级的编程技巧和设计模式。:高级程序员通常对某一领域有深入的了解,能够设计复杂的系统架构,解决技术难题,并指导初级和中级程序员。

洋少的博客 1432

教你快速学会设计模式

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版) ②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版) ③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版) ④【Web前端】从HT...

黑技的博客 427

耗时两月!20+真实案例场景、近300页、18W字,这份【Java设计模式实践指南】已然成神,堪称经典

什么是设计模式?这个问题我问过的面试者不下于数十次,回答五花八门。 在我看来,模式就是经验,设计模式就是设计经验,有了这些经验,我们就能在特定情况下使用特定的设计、组合设计,这样可以大大节省我们的设计时间,提高工作效率。 作为一个工作已久的老码农,经历的系统架构设计也算不少,接下来,我会把工作中用到的一些架构方面的设计模式总结成了一个文档分享给大家,望大家少走弯路。 创建者模式(五种) 工厂方法模式 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象

资料免费分享,点击名片 391

前端学习方法(含前端成神之路)

掌握JavaScript的基本语法、数据类型、函数、对象、数组等基础概念;学习框架和库:熟练掌握至少一个前端框架(如React、Angular或Vue)以及相关库(如Redux、Vuex等),提高开发效率;实践项目:通过实际项目或编程练习,提高编写JavaScript代码的能力;技巧:github官网中,搜索技术-awesome,就能找到很多优秀的项目,如 https://github.com/vuejs/awesome-vue。

朝阳39的博客 519

【JavaEE】单例模式和阻塞队列

阻塞队列是Java并发编程中一个非常重要的概念,它提供了一种线程安全且高效的机制来管理多线程环境下的任务调度和资源分配。通过选择合适的阻塞队列类型,可以有效地控制并发级别,提高系统的响应能力和吞吐量。

2302_79806056的博客 1372

史上超级详细:Java岗面试12家大厂成功跳槽,附项目源码

前言 很多Java程序员一直希望找到一份完整的学习路径,但是市面上很多书都是专注某一个领域的,没有一份完整的大图,以至于很多程序员很迷茫,不知道自己到底应该从哪里开始学,或者不知道自己学习些什么。 好在,很早之前就有一位阿里巴巴的技术专家总结了一份**《Java工程师成神之路》**,作者按照自己的经验总结了从基础,到高级、底层、架构、进阶、扩展等6个大的章节。几乎囊括了Java体系内的所有知识点。 这份资料之前开源在GitHub上,短短几个月时间,收获了15k+的Star数,最近,笔者了解到,该项目有了重大

m0_57286622的博客 165

写给初中级前端的高级进阶指南

.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rgba(51, 51, 51, 1) } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .ma...

优快云_KONGlX的博客 363

java后端开发学习路线

java后端开发学习路线 点击此处查看本篇文章视频出处 即使再小的帆也能远航~ 编程基础 java语言 语言基础 基础语法 面向对象 接口 容器 异常 泛型 反射 注解 I/O JVM虚拟机 类加载机制 字节码执行机制 JVM内存模型 GC垃圾回收 JVM性能监控与故障定位 JVM调优 多线程/并发 并发编程的基础 线程池 锁 并发容器 原子类 JUC并发工具类 数据结构和算法 数据结构 字符串 数组 链表 堆,栈,队列 二叉树 哈希 图 算法 排序 查找 贪心 分治 动态规划 回溯.

高小小天的博客 402
上一篇: 技术成神之路:设计模式(八)责任链模式
下一篇: 获取手机当前信号强度(dbm/asu值)解决 getGsmSignalStrength()总是返回99问题
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值