Java观察者模式实例代码分析
发表于:2025-02-16 作者:千家信息网编辑
千家信息网最后更新 2025年02月16日,这篇"Java观察者模式实例代码分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"J
千家信息网最后更新 2025年02月16日Java观察者模式实例代码分析
这篇"Java观察者模式实例代码分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Java观察者模式实例代码分析"文章吧。
优点
1.观察者和被观察者是抽象耦合的。
2.建立一套触发机制。
缺点
1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2.如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3.观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
使用场景
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
注意事项
1.JAVA 中已经有了对观察者模式的支持类。
2.避免循环引用。
3.如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
一、实现方式
1、观察者抽象类
package com.asurplus.common.observe;/** * 观察者 */public abstract class Observer { protected Subject subject; /** * 发布事件 */ public abstract void update();}
2、第一个观察者
package com.asurplus.common.observe;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class Observer1 extends Observer { public Observer1(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { log.info("观察者 1 收到通知:{}", this.subject.getState()); }}
3、第二个观察者
package com.asurplus.common.observe;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class Observer2 extends Observer { public Observer2(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { log.info("观察者 2 收到通知:{}", this.subject.getState()); }}
4、第三个观察者
package com.asurplus.common.observe;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class Observer3 extends Observer { public Observer3(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { log.info("观察者 3 收到通知:{}", this.subject.getState()); }}
5、定义主题
package com.asurplus.common.observe;import java.util.ArrayList;import java.util.List;/** * 主题 */public class Subject { /** * 观察者列表 */ private Listobservers = new ArrayList<>(); /** * 标志 */ private int state; public int getState() { return state; } /** * 标识被改变 * * @param state */ public void setState(int state) { this.state = state; // 通知所有观察者 notifyAllObservers(); } /** * 添加进接收者列表 * * @param observer */ public void attach(Observer observer) { observers.add(observer); } /** * 通知所有人被改变 */ public void notifyAllObservers() { for (Observer observer : observers) { observer.update(); } }}
类似于消息发布一样,有多个接收者,当标志位被改变的时候,通知多个接收者。
二、测试
package com.asurplus.common.observe;public class TestMain { public static void main(String[] args) { // 创建主题 Subject subject = new Subject(); // 添加观察者 new Observer1(subject); new Observer2(subject); new Observer3(subject); // 改变标志 subject.setState(10); }}
输出结果
可以看出,三个接收者都收到了事件通知,从而实现了我们的观察者模式。
以上就是关于"Java观察者模式实例代码分析"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
观察
观察者
对象
模式
内容
接收者
方面
目标
代码
实例
分析
主题
之间
多个
机制
标志
系统
循环
三个
事件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
下载测服务器
厦门神搜网络技术有限公司
2018网络安全答题题库
电信采购服务器芯片
湖北嵌入式软件开发哪家正规
网络安全绘图内容
macos 软件开发优势
迷你服务器更新失败
深圳市卡讯网络技术有限公司
服务器安全性检查
数据库主要技术参数
阿里云服务器下载目录
日照网络技术有限公司怎么样
cmd进入服务器
淮南软件开发定制公司
第5人格服务器崩溃
2022冬奥会网络安全提供商
软件开发的大专有哪些学校
哈利波特不同服务器可以赠送吗
网络安全主题绘画竖版
破解sqlite数据库代码
戴尔服务器指示灯灯图解
数据库中截取标准日期的年
数据库取字段后6位
明日方舟服务器更新多久
数据库技术基础学习
找到诈骗软件开发者管用吗
数据库培训基地
万网服务器管理
辽宁学考278版本服务器地址