简单理解常用设计模式(十)观察者模式

设计模式之观察者模式 本文先是介绍了观察者模式,给出定义、重要的角色、具体的代码实现。然后介绍了EventBus,从使用到刨析原理。最后我们又简单地对照了一下观察者模式和监听器模式。 阅读详情

这里记录一下观察者模式,偶尔会用到,也比较好理解。

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

采用原书场景:办公室员工为观察者,所有人都约定(订阅)了前台小姐姐,如果老板回来就通知他们,他们收起小差继续工作。

你会怎么写代码,是就前台类,员工类吗?

原书UML如下:


这里对员工和通知者(前台,或者老板【走后门进来前台不知道】)进行了抽象,不然在员工类里会依赖具体的通知者类,通知者类里也会依赖具体的员工类,这样通知者类更换了,员工类也必须修改对象类型,就耦合了,不利于拓展和维护。

测试类如下:

package com.gcc.ObserverModel;
/**
 * 观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
 * 在这个主题地下变化时,会通知所有观察着对象,使它们自动更新某个动作。
 * 
 * 本例解释:生成一个通知者,这个人可以是前台可以是老板等等。 new ReceptionNotify()
 * 			 生成希望接到通知的观察者,同时赋予姓名和希望得到哪个通知者.new ObserverA("张三",renotify)
 * 			 通知者添加他愿意通知的人.renotify.addObserver(oa)
 * 			 通知者设置通知的内容状态.renotify.setState("前台状态:老板回来了");
 * 			 通知者发送通知.renotify.notifyAction();
 */
public class TestObserver {

	public static void main(String[] args) {
		ReceptionNotify renotify = new ReceptionNotify();
		ObserverA oa = new ObserverA("张三",renotify);
		ObserverB ob = new ObserverB("李四",renotify);
		ObserverC oc = new ObserverC("王五",renotify);
		
		renotify.addObserver(oa);
		renotify.addObserver(ob);
		renotify.addObserver(oc);
		renotify.removeObserver(ob);//取消订阅通知
		
		renotify.setState("前台状态:老板回来了");
		renotify.notifyState();
		renotify.notifyAction();
		System.out.println();
		
		//----------------------------------------
		BossNotify bossNotify = new BossNotify();
		ObserverA oa2 = new ObserverA("张三",bossNotify);
		ObserverB ob2 = new ObserverB("李四",bossNotify);
		ObserverC oc2 = new ObserverC("王五",bossNotify);
		
		
		bossNotify.addObserver(oa2);
		bossNotify.addObserver(ob2);
		bossNotify.addObserver(oc2);
		
		bossNotify.setState("老板状态:本老板回来了");
		bossNotify.notifyState();
		bossNotify.notifyAction();
		
		
		
		
	}
	
}

员工(观察者)接口:

package com.gcc.ObserverModel;

public interface Observer {

	void update();
	
}

员工类:

package com.gcc.ObserverModel;

public class ObserverA implements Observer {

	String name;
	Notify notify;
	
	public ObserverA() {
		super();
	}

	public ObserverA(String name,Notify notify) {
		super();
		this.name = name;
		this.notify = notify;
	}

	public void askNotifyState(){
		this.notify.notifyState();
	}
	
	@Override
	public void update() {
		System.out.println(this.name+"关闭NBA直播,继续工作");
	}

}
package com.gcc.ObserverModel;

public class ObserverB implements Observer {

	String name;
	Notify notify;
	
	public ObserverB() {
		super();
	}

	public ObserverB(String name,Notify notify) {
		super();
		this.name = name;
		this.notify = notify;
	}


	@Override
	public void update() {
		System.out.println(this.name+"关闭股票行情,继续工作");
	}

}
package com.gcc.ObserverModel;

public class ObserverC implements Observer {

	String name;
	Notify notify;
	
	public ObserverC() {
		super();
	}

	public ObserverC(String name,Notify notify) {
		super();
		this.name = name;
		this.notify = notify;
	}

	@Override
	public void update() {
		System.out.println(this.name+"关闭新番动漫,继续工作");
	}

}

通知(主题)接口:

package com.gcc.ObserverModel;

public interface Notify {

	void addObserver(Observer observer);
	void removeObserver(Observer observer);
	void notifyAction();
	void notifyState();
	
}

通知类:

package com.gcc.ObserverModel;

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

public class ReceptionNotify implements Notify {

	private String state;
	
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}

	
	List<Observer> list = new ArrayList<Observer>();
	
	@Override
	public void addObserver(Observer observer) {
		list.add(observer);
	}

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

	@Override
	public void notifyAction() {
		for (Observer o : list) {
			o.update();
		}
	}

	@Override
	public void notifyState() {
		System.out.println(this.state);
	}

}
package com.gcc.ObserverModel;

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

public class BossNotify implements Notify {

	private String state;
	
	public String getState() {
		return state;
	}
	public void setState(String state) {
		this.state = state;
	}

	
	List<Observer> list = new ArrayList<Observer>();
	
	@Override
	public void addObserver(Observer observer) {
		list.add(observer);
	}

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

	@Override
	public void notifyAction() {
		for (Observer o : list) {
			o.update();
		}
	}

	@Override
	public void notifyState() {
		System.out.println(this.state);
	}

}

运行结果如下:

前台状态:老板回来了

张三关闭NBA直播,继续工作

王五关闭新番动漫,继续工作

老板状态:本老板回来了

张三关闭NBA直播,继续工作

李四关闭股票行情,继续工作

王五关闭新番动漫,继续工作

简单来理解,观察者模式就是解除耦合,让耦合的双方都依赖于抽象(接口),而不依赖于具体,从而使得各自的变化不会影响另一方。

感谢观看,咧。




关于Spring 中常用的那些设计模式 Spring 中常用的设计模式 1、我们通常说的 23 中经典设计模式可以通过下表一目了然: 创建型 工厂方法模式(FactoryMethod)、抽象工厂模式(AbstractFactory)、 建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)结构型适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、 装饰器模式(... 阅读详情

相关推荐

理解观察者模式与事件委托的设计模式实战

在软件工程领域,设计模式是解决特定问题的模板,它们能够帮助开发者以高效、清晰、可维护的方式组织代码。在众多设计模式中,观察者模式和事件委托是实现事件处理和状态更新的两种常用机制。尽管它们在应用中有相似之处,但其背后的实现原理和适用场景存在显著差异。观察者模式定义了一种一对多的关系,使得当一个对象状态发生变化时,所有依赖于它的其他对象都会收到通知并自动更新。这种模式强调的是对象间的依赖关系和动态绑定。事件委托则是利用了事件冒泡的机制,将事件监听器绑定到父元素上,而不是每个子元素单独绑定。

weixin_42509720的博客 904

设计模式之观察者模式(ObserverPattern)

设计模式之观察者模式(ObserverPattern) 文章目录设计模式之观察者模式(ObserverPattern)一.观察者模式(ObserverPattern)二.编程实例1.进制转换器2.客人敲门案例 一.观察者模式(ObserverPattern) 在生活中会遇到很多使用观察者模式的案例,比如股票跌涨后,股民作为观察者会对股票进行交易;客人来敲门,门铃响了之后管家就会去开门等等。其中观...

Worthy_Wang的博客 622

【AI深究】合成数据(Synthetic Data)深度解析:原理、算法与工程实践——全网最详细流程|核心原理、主流方法、数学表达、工程实践与细节、未来趋势|GAN、VAE、语言模型LLM合成如GPT

大家好,我是爱酱。本篇延续将会系统梳理合成数据(Synthetic Data)的核心原理、主流方法、数学表达、工程实践与未来趋势,结合数学公式,帮助你全面理解这一AI建模的关键技术。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 4929

设计模式之观察者模式简单理解

本篇文章总结于马士兵的视频教程《观察者模式》。个人非常推荐马士兵的视频教程,对于初学Java的人来说,J2SE基础视频非常不错,对于内存分析讲的十分到位。对于有一定基础的人来说,设计模式系列,反射系列,正则表达式系列都非常不错,不仅仅局限于Java,而C#学习者也可以看一看。 这里通过一个生活例子来讲观察者模式。这个场景就是,有一个小孩在睡觉,然后他老爸在旁边,小孩醒了他老爸就要喂他吃东西...

写代码的蜗牛 3900

【CIC-IDS数据集+机器学习】实现网络流量异常检测

本项目基于CIC-IDS数据集,使用多种机器学习算法实现网络流量异常检测系统。项目采用了完整的机器学习工作流程,从数据预处理到模型部署,实现了高精度的网络入侵检测。

XiaoMu_001的博客 1935

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。⭐️简单来说,,也就是去掉一个数的二进制表达的末位,右移一位就去掉一位,右移两位就去掉两位。下面就让我们来详细看看吧!

weixin_73453526的博客 8931

设计模式之-观察者模式,快速掌握观察者模式,通俗易懂的讲解观察者模式以及它的使用场景

通过观察者模式,天气预报中心和居民之间建立了一种松散的依赖关系,使得天气预报中心能够方便地通知居民们最新的天气情况,居民们也能够根据天气情况做出适当的调整。当谈到设计模式中的观察者模式(Observer Pattern)时,它是一种行为型设计模式,用于在对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,它的所有依赖者都会得到通知并自动更新。然后,我们定义一个具体的天气预报中心(ConcreteWeatherCenter)类,实现了主题接口,并维护了一个观察者列表。

咖啡程序员 5615

使用3d Slicer标注病灶并生成ROI掩膜

本篇博客给大家演示一下如何使用3d Slicer标注病灶并生成ROI掩膜,供深度学习模型训练使用。 关于3d Slicer和MRIcron的安装请看我的另一个帖子。 一、数据加载 你可以使用你手头的数据进行标注,这里为了示例方便,我是用的3d Slicer中给出的Sample Data中的MRBrainTumor1的数据。 二、病灶标注及保存 Modules选择Segment Editor: 然后点击Add按钮添加一个Segment,在下方便签上双击可以修改Segment的命名和颜色等。下方三个按钮

Su_Del的博客 1万+

设计模式之观察者模式ObserverPattern(十一)

观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。

徐泗空的博客 1047

UFSV3.1-RPMB实现与测试

UFS RPMB功能验证与测试指南 本文介绍了UFS(通用闪存存储)中RPMB(重放保护内存块)的功能验证与测试方法。主要内容包括: RPMB基础配置: 在Linux系统中查看RPMB设备节点 读取RPMB单元描述符获取配置信息 配置RPMB区域大小(16MB)和使能状态 RPMB特性验证: 获取单次写最大请求(16KB) 测试未编程认证密钥时的读写操作 验证认证密钥编程过程 测试用例: 包含4个测试用例,验证RPMB在不同状态下的行为 提供了详细的命令行操作和预期结果 本文可作为UFS RPMB功能验证。

小码哥的博客 1255

RagFlow专题三、RagFlow 关键技术(向量数据库、文档分块、Prompt 设计与召回排序优化)

FAISS 是由 Meta(Facebook)开源的高效向量检索库,适用于大规模向量搜索任务。,并了解了如何通过 RagFlow 机制优化信息检索和生成质量。(FAISS、Milvus、ES)用于高效存储和检索语义向量。提高 LLM 生成效果,增强 RagFlow 任务质量。(分块)策略,将文档拆分成更小的片段,提高检索效率。提高检索精准度,避免文本过长导致信息丢失。提升检索结果的相关性,提高生成质量。当多个检索结果被返回时,我们需要一个。在前一篇文章中,我们详细探讨了。在 RagFlow 任务中,

xiaoqi270620903的专栏 3040

深入理解设计模式之观察者模式

观察者模式定义了对象之间的一种一对多依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖它的对象(观察者)都会得到通知并自动更新。简单来说,观察者模式就像是一个消息发布与订阅系统,被观察者充当消息发布者,而观察者则是订阅者,当被观察者有新消息时,会自动推送给所有订阅的观察者。例如,在一个社交媒体平台上,用户发布一条动态,关注该用户的其他用户都会收到通知,这就是观察者模式的典型应用。

weixin_45969711的博客 846

恒玄BES调试笔记-BES2500如何Dump Anc Audio数据

从YP的4M flash改HP3的2M flash只需要改: 原工程:target.mk的export FLASH_SIZE ?= 0x200000和common.mk里的KBUILD_CPPFLAGS += -DNEW_IMAGE_FLASH_OFFSET=0x100000 OTA工程:target.mk的NEW_IMAGE_FLASH_OFFSET ?= 0x100000和FLASH_SIZE ?= 0x200000 ...

leezs的博客 1672

Java常用设计模式总结

前言:鸿洋大神的设计模式系列博客已经阅读完毕,下面来做个总结。 Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式) 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式分为三种类型,共23种: 创建型模式:单例模式、抽象工厂模式、建造者模式、

wu371894545的博客 1万+

GhidraMCP:AI驱动的逆向工程革命——让LLM自主操作Ghidra进行自动化分析

(Ghidra Machine Control Protocol)应运而生,它通过将LLM与Ghidra(美国NSA开源逆向工具)结合,实现了AI驱动的自动化逆向工程流程。逆向工程是软件安全、漏洞分析和代码审计的核心环节,但传统方法依赖人工分析,耗时且易出错。未来,随着LLM技术的演进和逆向工程工具的优化,GhidraMCP有望成为安全研究人员和开发者的核心工具,推动逆向工程进入“AI辅助时代”。GhidraMCP通过LLM与Ghidra的深度整合,重新定义了逆向工程的自动化边界。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2116

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【观察者模式】深入浅出-设计模式 之 观察者模式

0x01.简述 观察者模式(Observer Pattern)(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。(百度百科) 当对象间存在一对多关系时,可以使用观察者模式。 例如,当一个对象被修改时,则会自动通知它的依赖对象。 观察者模式属于行为型模式。 0x

ATFWUS的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++常用设计模式之:观察者模式

观察者模式是23种设计模式中很重要也很常用的模式,在软件开发中我们经常会遇到。 观察者模式的定义:定义了对象间的一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(被观察者)。当主题对象的状态发生更改时,会通知所有观察者,让它们能够自动更新。 在实际的应用中我们常常使用观察者模式来解决软件中的消息通信的问题。例如,我们有一个QT编写的QWidget应用,这个应用包含了多个QWidget窗...

250

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【设计模式】观察者模式

博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主威威喵原创,请多支持与指教。 本文首发于此 博主:威威喵|博客主页:https://blog.youkuaiyun.com/smile_running 观察者模式(Observer Pattern),是使用比较多的一种设计模式,它的模型一般情况下都是一对多的模型,当然,也不排除有一对一的情况发生。观察者(...

你若盛开,蜜蜂自来 9244

大话设计模式十:观察者模式

一.模式定义 Observer Pattern: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.  观察者模式(Observer Pattern):定义...

进击的小怪兽 608

设计模式之观察者模式理解

设计模式的作用 1.在编码中,合理使用设计模式将避免做一些重复性工作,有助于提高开发和设计效率 2.跨语言、跨平台、跨应用、跨国界 3.有助于提高系统的灵活性和可扩展性 4.合理使用设计模式并文档化,有助于别人更快理解系统 观察者模式的理解 概述 观察者模式也被称为发布/订阅模式,它订阅了一种一对多的依赖关系,让多个观察者同时监听某一个主体对象,在这个对象状态发生改变时,会通知所有观察者对象,更新...

qq_33261885的博客 332

【设计模式】最常用的设计模式之一的观察者模式

这是之前做的“产品详情页”的长截图,这里讲解一下这个页面与“观察者模式”的关系:在活动季,底部的“开始预订按钮”会变成“秒杀按钮”(所谓秒杀按钮,就是一个显示成灰色不可点击,并且一直处于倒计时状态的按钮,直到到达秒杀时间,比如0点整,秒杀按钮才由灰色变为橘黄色,并且可以点击), 当秒杀时间到时,不光底部的“秒杀按钮”变为“开始预订按钮”,可选班期的几个按钮也从灰色不可点击状态,变为白色可点击状...

你关注了我,是个概率极低的事件...... 2万+

深入理解Java设计模式-观察者模式

什么是观察者模式 先讲什么是行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。 观察者模式,是一种行为性模型,又叫发布-订阅模式,他定义对象之间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 模式的职责 观察者模式主要用于1对N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,...

小杰爱吃蛋的博客 523

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

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

weixin_39974223的博客 110

简易理解设计模式之:观察者模式——监听与回调

介绍: 观察者模式属于行为型模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 类图: Subject(抽象被观察者):抽象主题角色把所有观察者对象的引用保存在一个集合里,并提供可以增加和删除观察者的接口。 ConcreteSubject(具体被观察者):该角色接受具体观察者对象,并在具体主题...

TwcatL 899

设计模式-从回调函数入手理解观察者模式

通过简单Demo理解观察者模式,掌握了精髓才能理解更复杂的源码

蒋大钊的博客 1018
上一篇: 简单理解常用设计模式(九)建造者模式(例如通过第三者生成人物)
下一篇: 简单理解常用设计模式(十一)适配器模式(例如姚明叫人翻译英文)
gcc_front
博客等级 码龄9年 16粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值