news 2026/4/25 23:45:20

JAVA设计模式之观察者模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JAVA设计模式之观察者模式

观察者模式应用场景

在我们开发的过程中,经常会遇到一些当什么什么事情发生的时候,然后做什么什么事。比如某种商品的物价上涨时会导致部分商家高兴,而消费者伤心。

代码示例

抽象被观察者类
package com.demo.test.observe.abs; import java.util.ArrayList; import java.util.List; public abstract class Subject { private List<Observe> observeList = new ArrayList<>(); public void attach(Observe observe){ this.observeList.add(observe); }; public void detach(Observe observe){ this.observeList.remove(observe); }; public void allNotify(){ for(Observe observe:observeList){ observe.update(); } } }
抽象观察者类
package com.demo.test.observe.abs; public abstract class Observe { public abstract void update(); }
具体被观察者类
package com.demo.test.observe; import com.demo.test.observe.abs.Subject; import java.util.List; public class SubjectA extends Subject { }
具体观察者1
package com.demo.test.observe; import com.demo.test.observe.abs.Observe; public class StudentObserve extends Observe { public void update(){ System.out.println("老师来了,快坐好"); } }
具体观察者2
package com.demo.test.observe; import com.demo.test.observe.abs.Observe; public class StudentBObserve extends Observe { @Override public void update() { System.out.println("老师来了,别吃了"); } }
客户端
package com.demo.test.observe; import com.demo.test.observe.abs.Observe; import com.demo.test.observe.abs.Subject; public class Client { public static void main(String[] args){ Subject subjectA = new SubjectA(); Observe studentObserve = new StudentObserve(); subjectA.attach(studentObserve); subjectA.attach(new StudentBObserve()); subjectA.allNotify(); } }

JAVA 自带的观察者类

被观察者
package com.demo.test.observe.javaObserve; import java.util.Observable; public class Subject1 extends Observable { public void change(){ setChanged(); //如果不执行setChanged,就不会调用update函数。 } }
观察者A
package com.demo.test.observe.javaObserve; import java.util.Observable; import java.util.Observer; public class ObserveA implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("java 自带观察者:A"); } }
观察者B
package com.demo.test.observe.javaObserve; import java.util.Observable; import java.util.Observer; public class ObserveB implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("java 自带观察者:B"); } }

客户端

package com.demo.test.observe.javaObserve; import java.util.Observable; import java.util.Observer; public class Client { public static void main(String[] args){ Subject1 subject = new Subject1(); Observer observerA = new ObserveA(); Observer observerB = new ObserveB(); subject.addObserver(observerA); subject.addObserver(observerB); //这一步主要调用里面的setChanged,否则update不执行。setChanged必须在Observable继承类内执行,因为它是protected修饰的。 subject.change(); subject.notifyObservers(); } }
© 著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务


喜欢的朋友记得点赞、收藏、关注哦!!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 8:31:29

多功能AI精准监管系统开发:让监管不缺位、不越位

做监管工作的人&#xff0c;天天跟海量数据打交道&#xff0c;心里都有本难念的经&#xff1a;靠人工筛查&#xff0c;不仅费时间&#xff0c;还总担心漏过违规行为&#xff1b;可要是搞“一刀切”的监管&#xff0c;又容易误伤合规经营的企业&#xff0c;让人家白跑冤枉路、多…

作者头像 李华
网站建设 2026/4/25 15:06:42

1小时打造手机银行模拟器原型验证创意

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个手机银行模拟器的最小可行产品(MVP)&#xff0c;要求&#xff1a;1. 仅实现核心用户流程(登录-主页-转账) 2. 使用预制UI组件 3. 模拟数据响应 4. 可交互演示 5. 一键导出原…

作者头像 李华
网站建设 2026/4/22 19:12:42

前端新手必看:err_empty_response错误完全指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式学习模块&#xff0c;通过简单示例向新手解释err_empty_response。包含&#xff1a;1) 基础概念动画讲解&#xff1b;2) 可修改的代码沙盒&#xff0c;故意制造空响应…

作者头像 李华
网站建设 2026/4/17 18:50:06

5分钟搭建MySQL配置冲突测试环境

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个快速原型工具&#xff0c;一键创建具有不同lower_case_table_names设置的MySQL测试环境。功能包括&#xff1a;1. 启动多个Docker容器(不同配置) 2. 自动部署测试数据库 3.…

作者头像 李华
网站建设 2026/4/25 0:43:42

37、Linux 信号与时间管理全解析

Linux 信号与时间管理全解析 信号处理 在 Linux 系统中,信号是一种重要的内核与用户空间通信的机制。当进程遇到跟踪陷阱时,会触发特定的信号。在信号处理方面,有一个重要的概念是带有效载荷发送信号。 当使用 SA_SIGINFO 标志注册信号处理程序时,会传递一个 siginfo…

作者头像 李华