java设计模式:观察者模式

        在平常的开发工作中,经常会使用到设计模式。合理的使用设计模式,可以提高开发效率、提高代码质量、提高代码的可拓展性和维护性。今天来聊聊观察者模式。

        观察者模式是一种行为型设计模式,用于对象之间一对多的依赖关系,当被观察对象发生变化时会通知所有观察者进行相应的更新。

        在观察者模式中,主要包括:

        1:主题(Subject):定义了被观察的对象,存储了观察者的列表,并提供了方法用于增加、删除和通知观察者的方法。

        2:观察者(Observer):定义了一个接口或者抽象类,通常包括更新方法,在主题更新时调用。

        3:具体主题(Concrete Subject):实现主题接口,将状态变化通知给观察者。

        4:具体观察者(Concrete Observer):实现观察者接口,负责接受主题的更新并更新自身的状态。

        使用场景:

        1:当一个对象的改变需要同时通知给其他多个对象。可以使用观察者模式。

        2:当一个对象需要广播通知给其他多个对象,可以使用观察者模式。

        简单示例:

        主题接口:

package test.boot.observer;public interface Subject {void registerObserver(Observer observer);void delObserver(Observer observer);void notifyObservers();}

        主题实现类:

package test.boot.observer;import java.util.ArrayList;
import java.util.List;public class SubjectImpl implements Subject {private List<Observer> observerList = new ArrayList<>();private String msg;@Overridepublic void registerObserver(Observer observer) {observerList.add(observer);}@Overridepublic void delObserver(Observer observer) {observerList.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observerList) {observer.update(msg);}}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;notifyObservers();}}

        观察者接口:

package test.boot.observer;public interface Observer {void update(String msg);}

        观察者1:

package test.boot.observer;public class ObserverFirstImpl implements Observer{@Overridepublic void update(String msg) {System.out.println("ObserverFirstImpl update " + msg);}
}

        观察者2:

package test.boot.observer;public class ObserverSecondImpl implements Observer{@Overridepublic void update(String msg) {System.out.println("ObserverSecondImpl update " + msg);}
}

        测试类:

package test.boot.observer;public class ObserverTest {public static void main(String[] args) {SubjectImpl subject = new SubjectImpl();Observer observerA = new ObserverFirstImpl();Observer observerB = new ObserverSecondImpl();subject.registerObserver(observerA);subject.registerObserver(observerB);subject.setMsg("hello");subject.setMsg("world");}}

        运行结果:

        

        以上为观察者模式简单示例,加油!美好的风景一直在路上,期待遇见更好的自己!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/459242.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux第43步_移植ST公司uboot的第4步_uboot测试

uboot移植结束后&#xff0c;需要进行测试。 1、烧录程序 1)、将STM32MP157开发板的网络接口与路由器的网络接口通过网线连接起来。 2)、将开发板的串口和电脑通过USB线连接起来。 3)、将开发板的USB OTG接口和电脑通过USB线连接起来。 4)、将开发板上拨码开关拨到“000”…

IS-IS P2P网路类型 地址不在同一子网建立邻居关系

拓扑图 由于IS-IS是直接运行在数据链路层上的协议&#xff0c;并且最早设计是给CLNP使用的&#xff0c;IS-IS邻居关系的形成与IP地址无关。但在实际的实现中&#xff0c;由于只在IP上运行IS-IS&#xff0c;所以是要检查对方的IP地址的。如果接口配置了从IP&#xff0c;那么只要…

beep蜂鸣器驱动实验-蜂鸣器驱动代码框架测试

一. 简介 上一篇文章学习了编译蜂鸣器驱动框架代码&#xff0c;并进行了编译。文章地址如下&#xff1a; beep蜂鸣器驱动实验-蜂鸣器驱动框架代码实现-CSDN博客 本文对上一篇所实现的蜂鸣器框架代码进行测试。 二. 蜂鸣器驱动代码框架测试 1. 拷贝驱动程序 注意&#xf…

MongoDB部署策略

内 容 简 介 本文介绍了MongoDB数据库的优点的数据存储模式的安装部署过程。 利用MongoDB在存储海量数据上的优势&#xff0c;部署存储空间大数据。 欢迎批评指正补充 由于编者水平有限&#xff0c;所搜集资料也很有限&#xff0c;制定的规范肯定有考虑不周全、甚至完全错误…

Pymysql之Connection中常用API

Connection中常用API 1、open() &#xff1a;检测数据库是否连接。 connect.open&#xff1a;如果数据库连接返回Trhe&#xff0c;否则返回False。 2、ping(reconnectTrue) connect.ping(reconnectTrue):如果reconnectTrue表示连接断开后&#xff0c;重新进行连接。 import…

C++重新入门-C++变量作用域

目录 1.C变量定义 2.C作用域 3.局部变量 4.全局变量 5.块作用域变量 6.初始化局部变量和全局变量 1.C变量定义 一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明的变量&#xff0c;称为…

Mysql进阶(sql优化和explain关键字)

一、为什么要对SQL进行优化&#xff1f; 由于业务数据量的增多&#xff0c;SQL的执行效率对程序的运行效率影响增大&#xff0c;此时就需要对SQL进行优化。 二、SQL优化的方法 1.查询sql尽量不要使用select * &#xff0c;而是具体字段。 节省资源&#xff0c;减少开销。 …

1572.矩阵对角线元素的和(Java)

题目描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 输入&#xff1a; mat [[1,2,3], [4,5,6], [7,8,9]] 输出&#xff1a; 25 解释&#xff1a;对角线的和为&…

1978-2022年地级市全要素生产率数据

1978-2022年地级市全要素生产率数据 1、时间&#xff1a;1978-2022年 2、来源&#xff1a;城市统计年鉴以及各省市的统计年鉴 3、指标&#xff1a;省份、地区、年份、OLS、FE、RE、DGMM、SGMM、SFA1、SFA2、SFA3、SFA3D、TFE、非参数法 4、范围&#xff1a;421地区 5、参考…

前端架构: 从vue-cli探究脚手架原理

从使用角度理解什么是脚手架 脚手架本质是一个操作系统的客户端 在终端中去执行一个命令&#xff0c;这个命令本身它就是一个客户端我们其实可以把脚手架理解为操作系统的一个客户端通过命令去执行它的时候&#xff0c;这个命令往往是这样的一个构造&#xff0c;如下 比如&…

图像处理入门:OpenCV的基础用法解析

图像处理入门&#xff1a;OpenCV的基础用法解析 引言OpenCV的初步了解深入理解OpenCV&#xff1a;计算机视觉的开源解决方案什么是OpenCV&#xff1f;OpenCV的主要功能1. 图像处理2. 图像分析3. 结构分析和形状描述4. 动态分析5. 三维重建6. 机器学习7. 目标检测 OpenCV的应用场…

车载测试Vector工具CANape——常见问题汇总(下)

车载测试Vector工具CANape——常见问题汇总(下) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何 消耗你的人和事,多看…