Java~设计模式之观察者模式 || 班长大喊老师来啦

article/2025/9/10 15:49:07

文章目录

    • 观察者模式
    • 实现

观察者模式

  • 定义: 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
  • 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 关键:在被观察者类里有一个 集合 存放观察者们。
  • 优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
  • 缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
  • 举例: 就好比我今天要举的例子,班长是被观察者对象,有很多的学生也就是观察者,学生观察班长,当班长看到老师来了,就会喊老师来了, 同学们怕被抓到就会去学习, 这也就是观察者模式的优点观察者和被观察者是抽象耦合的和一键触发机制, 但是又有缺点, 如果人数太多, 比如隔壁班的也在观察我们班的班长, 那人数太多就会通知起来太慢, 而且如果隔壁班的班长不是观察我们班的班长, 就会造成循环通知, 就是我们班班长通知一遍, 然后隔壁班班长有通知一遍, 就会造成循环调用, 最主要的是学生知识知道老师来了, 并不知道是哪个老师来了, 这对要准备书本的学生不是很友好
  • 下面我们用代码实现这个例子

实现

  • 观察者接口
/*
观察者接口*/
public interface Observer {/*观察者做出改变*/void update();
}
  • 观察者实例
/*
学生是观察者*/
public class Student implements Observer {private String name;private boolean studying; //true表示正在学习, false表示在玩public Student(String name, boolean studying) {this.name = name;this.studying = studying;}@Overridepublic void update() {if (studying) {System.out.println(name + "依旧学习");} else {System.out.println(name + "吓了一跳然后开始学习");this.studying = true;}}
}
  • 被观察者接口
/*
被观察者接口*/
public interface Observable {/*添加观察者*/void addObserver(Observer observer);/*删除观察者*/void deleteObserver(Observer observer);/*通知观察者*/void notifyObserver();
}
  • 被观察者实例
/*
班长是被观察者*/
public class Monitor implements Observable {/*有很多的观察者去观察被观察者*/private Vector<Observer> students;public Monitor() {this.students = new Vector<>();}@Overridepublic void addObserver(Observer observer) {this.students.add(observer);}@Overridepublic void deleteObserver(Observer observer) {this.students.remove(observer);}@Overridepublic void notifyObserver() {System.out.println("老师来了!!!");for (Observer observer : this.students) {observer.update();}}}
  • 测试
public class Client {public static void main(String[] args) {//被观察者Monitor monitor = new Monitor();//观察者Student a = new Student("a", true);Student b = new Student("b", false);Student c = new Student("c", true);Student d = new Student("d", false);Student e = new Student("e", false);monitor.addObserver(a);monitor.addObserver(b);monitor.addObserver(c);monitor.addObserver(d);monitor.addObserver(e);//老师来了, 班长进行了通知学生monitor.notifyObserver();}
}
  • 结果
    在这里插入图片描述

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

相关文章

张小飞的Java之路——第九章

写在前面&#xff1a; 视频是什么东西&#xff0c;有看文档精彩吗&#xff1f; 视频是什么东西&#xff0c;有看文档速度快吗&#xff1f; 视频是什么东西&#xff0c;有看文档效率高吗&#xff1f; 诸小亮&#xff1a;“封装说完后&#xff0c;我们接着看面向对象的第二大…

Java设计模式(2 / 23):观察者模式

定义 观察者&#xff08;Observer&#xff09;模式定义了对象之间的一对多依赖&#xff0c;这样一来&#xff0c;当一个对象改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新。 OO设计原则&#xff1a;为了交互对象之间的松耦合设计而努力。 案例&#xff1a;气…

大聪明教你学Java设计模式 | 第十三篇:观察者模式

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

Java 设计模式(十三):代理模式

参考链接&#xff1a;代理模式-Proxy Pattern 近年来&#xff0c;代购已逐步成为电子商务的一个重要分支。代购简单来说就是找人帮忙购买所需要的商品&#xff0c;代购网站就是其中一种产物&#xff0c;它为消费者提供在线的代购服务&#xff0c;如果看中某国外购物网站上的商…

Java设计模式:观察者模式

一、什么是观察者模式&#xff1f; 又叫做发布-订阅模式&#xff0c;定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;则所有依赖于它的对象都会得到通知并自动更新。UML结构图如下&#xff1a; 其中涉及到四种角色&#xff1a; 1.抽象目标&a…

初探Java设计模式------观察者模式

前言 最近刚开始学习RxJava&#xff0c;众所周知&#xff0c;Rxjava就是扩展的观察者模式&#xff0c;所以想学习Rxjava&#xff0c;先入手了解一下观察者模式是很有必要的。那么今天就先稍微了解一下什么是观察者模式。 定义 观察者(Observer)模式&#xff1a;是对象的行为模…

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

&#xff08;一&#xff09;观察者模式 观察者模式定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 该模式有以下角色&#xff1a; &#xff08;1&#xff09;抽象主题&#xff08;Subjec…

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

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

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

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

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

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

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

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

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

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

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

今天讲解一下如何部署JSP应用到阿里云服务器上&#xff0c;我使用的后台服务器是 Tomcat服务器&#xff0c;服务器应用的开发语言是 Java Web &#xff0c;后台的数据库使用的是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每个类来说最重要的组成部分&#xff0c;之前也详细介绍过构造函数的相关知识&#xff0c;今天给构造函数进行补充&#xff0c;主要说明一下构造函数的初始值列表 一、初始化列表的写法 仍然以之前介绍构造函数时使用的学生类来…

C++初始化列表详解

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

C++类的初始化列表

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

详解初始化列表

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

C++ 成员初始化列表

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

【深入理解】初始化列表

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