java设计模式(3)--观察者模式

article/2025/9/10 16:31:48
(一)观察者模式
观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

该模式有以下角色:

(1)抽象主题(Subject)角色:该角色提供了具体主题角色类实现的接口,定义了管理(添加、删除等)观察者对象的方法。

(2)具体主题(ConcreteSubject)角色:该角色保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;管理观察者对象的具体实现。

(3)抽象观察者(Observer)角色:该角色提供了具体观察者角色类实现的接口。

(4)具体观察者(ConcreteObserver)角色:该角色保存一个指向具体主题对象的引用和一个与主题的状态相符的状态,在得到通知时更新自己。


(二)java对观察者模式的支持:

          java中提供了java.util.Observable类和java.util.Observer接口,让我们省略了抽象主题角色和抽象观察者角色的声明。

          我们举个例子:Subject中的Email发生更改,即通知Observer1和Observer2两个观察者。

/*** 具体主题对象**/
public class ConcreteSubject extends Observable{private String name;private String email;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}//更改Email信息方法public void modifyEmail(String email){		this.email = email;		//调用父类的方法,改变被观察者的状态 this.setChanged();		//通知客户名字发生改变this.notifyObservers(this);		System.out.println("已通知观察者数:"+this.countObservers());}
}/*** 具体观察者对象1*/
public class ConcreteObserver1 implements Observer {//收到主题状态更新通知时更新自己public void update(Observable o, Object arg) {ConcreteSubject s = (ConcreteSubject)arg;System.out.println("Observer1收到通知:" + s.getName() + "信息发生变动:" + s.getEmail());}
}/*** 具体观察者对象2*/
public class ConcreteObserver2 implements Observer {//收到主题状态更新通知时更新自己public void update(Observable o, Object arg) {ConcreteSubject s = (ConcreteSubject)arg;System.out.println("Observer2收到通知:" + s.getName() + "信息发生变动:" + s.getEmail());}
}/*** 测试程序*/
public class Main {public static void main(String []args){Subject subject = new Subject();subject.setName("zhangsan");subject.setEmail("1234567@163.com");Observer1 observer1 = new Observer1();Observer2 observer2 = new Observer2();subject.addObserver(observer1);subject.addObserver(observer2);subject.modifyEmail("7654321@163.com");}
}
运行结果:

Observer2收到通知:zhangsan信息发生变动:7654321@163.com
Observer1收到通知:zhangsan信息发生变动:7654321@163.com
已通知观察者数:2

(三)优缺点

      .....




       



http://chatgpt.dhexx.cn/article/u42NiA4r.shtml

相关文章

Java设计模式之行为型:观察者模式

一、什么是观察者模式: 观察者模式又称为 发布-订阅模式,定义了对象之间一对多依赖关系,当目标对象(被观察者)的状态发生改变时,它的所有依赖者(观察者)都会收到通知。一个观察目标可以对应多个观察者,而这些观察者之间…

java监听设计模式(java观察者设计模式)

今天给大家分享一下观察者设计模式(监听设计模式),该模式在很多主流得框架、源码中使用率非常高。在分享之前先给大家讲一个我们使用手机的一个场景,我们都用过手机,当我们手机来电话的时候,会有各种复杂的…

【十一】设计模式~~~结构型模式~~~代理模式(Java)

【学习难度:★★★☆☆,使用频率:★★★★☆】 6.1. 模式动机 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起…

JAVA架构之路(设计模式之观察者模式)

设计模式之观察者模式 定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 核心原理: 1.被观察者中维护一个观察者对象列表 2.观察者可新增可可移除。 需要角色&#…

程序员百宝箱---搭建自己专属的在线工具集

相信各位开发者/程序员在开发过程中都使用过各种在线工具吧。比如 1 校验或格式化 json 字符串 2 使用 base64 的加密解密,url 的编码解码 urlencode、urldecode 等 3 调试正则表达式是否正确 4 时间戳与格式化日期互相转换 5 文本对比,比较两个代码文件…

如何部署JSP应用到阿里云服务器上(一)

今天讲解一下如何部署JSP应用到阿里云服务器上,我使用的后台服务器是 Tomcat服务器,服务器应用的开发语言是 Java Web ,后台的数据库使用的是MySQL 1 打开阿里云官方网站 https://www.aliyun.com/?utm_mediumtext&utm_sourcebdbrand&am…

开源项目精选推荐-杨小杰工具箱(YoungxjTools)

演示 预览地址: https://tools.yum6.cn/ 程序介绍 01、首页底部友情链接 02、网站公告页面功能 03、内置留言管理功能 04、后台网站信息设置 05、内置smtp发信配置 06、支持两主题的切换 07、关于页面支持留言, 08、程序已集成32种小工具 更多功能 介绍 请搭建 自行测试

C++构造函数之初始化列表

C构造函数之初始化列表 构造函数可以说是对于C每个类来说最重要的组成部分,之前也详细介绍过构造函数的相关知识,今天给构造函数进行补充,主要说明一下构造函数的初始值列表 一、初始化列表的写法 仍然以之前介绍构造函数时使用的学生类来…

C++初始化列表详解

目录: 定义 使用初始化列表的原因 必须使用初始化列表的时候 成员变量的顺序 定义 与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号…

C++类的初始化列表

意义 初始化列表是类中构造函数的一部分,用于实例化类中变量时 赋初值。 需要先了解 构造函数的基本知识。CSDN-构造函数https://blog.csdn.net/weixin_44212838/article/details/124901019?spm1001.2014.3001.5501 用法 在函数头与函数体之间,用一…

详解初始化列表

初始化列表 定义 构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化列表)。初始化列表位于函数参数表之后,却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。 Date(int year, int month, in…

C++ 成员初始化列表

这里写目录标题 数据成员是某一个类的对象,且这个类没有默认构造函数数据成员的类型是const或者引用子类初始化父类初始化列表先后顺序使用成员初始化列表的优点 在以下三种情况下需要使用初始化成员列表: 需要初始化的数据成员是某一个类的对象&#xf…

【深入理解】初始化列表

目录 一、什么是初始化列表? 二、初始化列表长啥样? 三、初始化列表的特性 1、由于是在定义阶段进行的初始化,所以,只能在定义阶段进行的初始化类型便只能在初始化列表中进行初始化。 2、初始化顺序不是跟着初始化列表走的&#x…

C++ 初始化列表详解

目录 1.什么是初始化列表 2.什么时候需要使用初始化列表? 3.初始化列表的效率 4.初始化列表的初始化顺序 1.什么是初始化列表 class A { public:A(int value):m_dada(value){}private:int m_dada; }; 如上图,红色圈起来的部分,就是构造函…

【C++】-- 初始化列表

目录 一、用初始化列表初始化对象 1.初始化列表用法 2.初始化列表特性 二、explicit关键字 1.内置类型的隐式转换 2.如何避免单参构造函数初始化发生隐式类型转换 三、匿名对象 1.匿名对象定义 2.匿名对象应用场景 创建一个类对象时,编译器通过调用构造函…

字符串逆序(数组倒序输出)

题目信息: 样例输出 copy edcba 新手导读: 题目描述信息:字符串的倒序输出肯定是字符数组的倒序输出; 输入信息:输入条件是最后字符不为回车;所以应该先用变量存入字符进行判断,再使用这个…

C语言实现字符串倒序

C语言显示字符串倒序 倒序字符串的方法很多&#xff0c;这里给出常见的两种 1.倒序字符串指针法 void reverse_string(char *arr) {int len strlen(arr);char* left arr; //指向头部的指针char* right arr (len - 1); //指向尾部的指针char temp;while(left <…

C语言:输入一串字符串,并倒序输出(vs)

一&#xff1a;问题&#xff1a; 输入一串字符串倒序输出 例&#xff1a;输入abcdefg 输出gfedcba 二&#xff1a;思路&#xff1a; &#xff08;1&#xff09;先输入一串字符串&#xff0c;然后利用for语句倒序输出即可&#xff1b; 三&#xff1a;实现过程&#xff1a; …

字符串倒序输出

题目&#xff1a;输入一个字符串&#xff0c;将该串倒序输出。例如输入字符串hello&#xff0c;倒序输出为olleh。 str1 str(input(请输入字串: )) print(输入的字符是&#xff1a;%s%str1) str2 #定义一个空串用来接收倒序后的字串 for i in str1[::-1]:#对字串进行倒序输出…

字符串的倒叙输出(直接倒叙和单词倒叙)

一.字符串的直接倒叙 输入一个字符串&#xff0c;实现倒叙输出,我想到的方法有两种&#xff1a; 首先把输入的字符串存入一个数组&#xff1b; 1.方法一&#xff1a;直接逆序打印这个数组&#xff0c;即从最后一个元素向前打印&#xff1b; C代码&#xff1a; #include <std…