21-Java观察者模式 ( Observer Pattern )

Java备忘录模式

    • 摘要
    • 实现
    • 范例

  • 观察者模式 ( Observer Pattern ) 常用于对象间存在一对多关系时,比如,当一个对象被修改时,需要自动通知它的依赖对象

  • 观察者模式属于行为型模式

摘要

1. 意图

  • 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

2. 主要解决

  • 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作

3. 何时使用

  • 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知

4. 如何解决

  • 使用面向对象技术,可以将这种依赖关系弱化

5. 关键代码

  • 在抽象类里有一个 ArrayList 存放观察者们

6. 应用实例

  • 拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价;
  • 西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作;

7. 优点

  • 观察者和被观察者是抽象耦合的;
  • 建立一套触发机制;

8. 缺点

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间;
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃;
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化;

9. 使用场景

  • 有多个子类共有的方法,且逻辑相同;
  • 重要的、复杂的方法,可以考虑作为模板方法;

10. 注意事项

  • JAVA中已经有了对观察者模式的支持类;
  • 避免循环引用;
  • 如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式;

实现

在这里插入图片描述

观察者模式使用三个类 Subject、Observer 和 Client :Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法

  1. 定义Subject类、Observer抽象类和扩展了抽象类Observer的实体类;
  2. 定义ObserverPatternDemo类使用Subject和实体类对象来演示观察者模式;

范例

1. 创建 Subject 类

Subject.java

package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class Subject {private List<Observer> observers = new ArrayList<Observer>();private int state;public int getState() {return state;}public void setState(int state) {this.state = state;notifyAllObservers();}public void attach(Observer observer){observers.add(observer);      }public void notifyAllObservers(){for (Observer observer : observers) {observer.update();}}    
}

2. 创建 Observer 类

Observer.java

package com.demo.gof;
public abstract class Observer {protected Subject subject;public abstract void update();
}

3. 创建实体观察者类 BinaryObserver

BinaryObserver.java

package com.demo.gof;
public class BinaryObserver extends Observer{public BinaryObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); }
}

OctalObserver.java

package com.demo.gof;
public class OctalObserver extends Observer{public OctalObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); }
}

HexaObserver.java

package com.demo.gof;
public class HexaObserver extends Observer{public HexaObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); }
}

4. 使用 Subject 和实体观察者对象

ObserverPatternDemo.java

package com.demo.gof;
public class ObserverPatternDemo {public static void main(String[] args) {Subject subject = new Subject();new HexaObserver(subject);new OctalObserver(subject);new BinaryObserver(subject);System.out.println("First state change: 15"); subject.setState(15);System.out.println("Second state change: 10");    subject.setState(10);}
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/ObserverPatternDemo.java
$ java  com.demo.gof.ObserverPatternDemo
First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010

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

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

相关文章

css选择器nth-child(n)的学习理解

css3 新增的:nth-child(n)选择器您真的理解吗&#xff1f; :nth-child(n)&#xff1a;用来选择某个父元素的一个或多个特定的子元素。其中 n 是一个参数&#xff0c;代表了你想要选择的子元素的序号。这里的 n 可以是以下几种形式&#xff1a; /*1:具体的数字&#xff1a;*/ …

给 spyter/all-spark-notebook 添加scala支持

spyter/all-spark-notebook默认没有安装scala notebook&#xff0c;需要手动添加。 你可以创建一个新的 Dockerfile&#xff0c;在其中添加你需要的配置和组件。以下是一个简单的例子&#xff1a; FROM jupyter/all-spark-notebook:x86_64-ubuntu-22.04 #冒号后可以是latest&a…

【漏洞复现】锐捷网络NBR700G 信息泄露

0x01 产品简介 锐捷网络NBR700G路由器是锐捷网络股份有限公司的一款无线路由设备。 0x02 漏洞概述 锐捷网络NBR700G路由器存在信息漏洞。未授权的攻击者可以通过该漏洞获取敏感信息。 0x03 测绘语句 fofa&#xff1a;body"系统负荷过高&#xff0c;导致网络拥塞&…

Mint_21.3 drawing-area和goocanvas的FB笔记(六)

FreeBASIC gfx 基本 graphics 绘图 一、旧故事 DOS时代PC技术将各类硬插卡限制在 640K到1MB的空间范围内&#xff0c;BIOS负责在相关位置写读测试卡的存在&#xff0c;那时期的Color Video在0xB800&#xff0c;Monochrome Video在0xB000&#xff0c;这是显卡的内存地址&#…

Java中介者模式剖析及使用场景

中介者模式 一、介绍二、智能家居系统项目实现三、总结1.优点2.缺点3.使用经验4.Spring框架类似使用思想 一、介绍 介者模式是一种行为型设计模式&#xff0c;它允许对象之间通过一个中介者对象进行通信&#xff0c;而不是直接相互引用。将多对多的关系转化为一对多的关系&…

iOS17.4获取UDID安装mobileconfig描述文件失败 提示“安全延迟进行中”问题 | 失窃设备保护

iOS17.4这两天已经正式发布&#xff0c; 在iOS 17.4版本中新增了一个名为"失窃设备保护"的功能&#xff0c;并提供了一个"需要安全延迟"的选项。 iOS17.4获取UDID安装mobileconfig描述文件失败 提示“安全延迟进行中”问题 | 失窃设备保护 当用户选择启用…

美洲狮优化算法(Puma Optimizar Algorithm ,POA)求解机器人栅格地图最短路径规划(提供MATLAB代码)

一、美洲狮优化算法 美洲狮优化算法&#xff08;Puma Optimizar Algorithm &#xff0c;POA&#xff09;由Benyamin Abdollahzadeh等人于2024年提出&#xff0c;其灵感来自美洲狮的智慧和生活。在该算法中&#xff0c;在探索和开发的每个阶段都提出了独特而强大的机制&#xf…

MySQL在报表统计中的综合实践:SQL语句与函数应用

引言 在数据分析与报表制作领域&#xff0c;MySQL因其出色的性能和丰富的统计功能&#xff0c;成为了众多企业构建报表系统的首选数据库引擎。本篇文章将深度剖析如何利用MySQL的SQL语句和统计函数完成日常报表统计任务&#xff0c;包括但不限于按天、周、月、季度和年的数据汇…

【LeetCode: 212. 单词搜索 II - dfs】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

华为OD机试C卷“跳步-数组”Java解答

描述 示例 算法思路1 不断移动数组将元素删去&#xff08;并未彻底删除&#xff0c;而是将数字元素前移实现“伪删除”&#xff09;这样删除元素的位置就呈现一定规律&#xff0c;详细见下图&#xff08;潦草的画&#xff09; 答案1 import java.util.*;public class Main {…

Neovim基本介绍

目录 Neovim出现的原因优化点安装1.源代码安装2.管理包安装3.下载安装包安装 配置运行健康检查Oni Neovim出现的原因 neovim代码库不需要向后兼容,方便开发维护解决vim插件编写困难,特别是异步操作解决vim插件编写困难,不再要求插件开发者需要熟悉vimscript默认配置适应现代开…

【MySql学习之路】window环境下MySql安装和安装过程中出现的问题

environment:windows software:mysql 本文主要分享mysql关系型数据库在干净的环境下,第一次安装以及在安装过程中出现的常见问题和解决方法。目前官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的。很多人下了zip格式的解压发现没有setup.exe,面对一堆文件无从…

最全NVIDIA Jetson开发板参数配置和购买指南

NVIDIA开发的GPU不仅在电脑显卡领域占据大量份额&#xff0c;在嵌入式NVIDIA的Jeston系列开发板也近乎是领先的存在&#xff0c;特别是NVIDIA Jeston系列开发板在算力和成本的平衡上都要优于其他厂家&#xff0c;性价比很高&#xff0c;设备体积小。本博文旨在给采购NVIDIA Jes…

2024年华为OD机试真题- 项目排期-Python-OD统一考试(C卷)

题目描述: 项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。 输入描述: 第一行…

【LeetCode每日一题】299. 猜数字游戏

文章目录 [299. 猜数字游戏](https://leetcode.cn/problems/bulls-and-cows/)思路&#xff1a;代码&#xff1a; 299. 猜数字游戏 思路&#xff1a; 遍历两个字符串 secret 和 guess&#xff0c;若字符既在相同位置上又相等&#xff0c;则位置和数字都正确&#xff0c;对应的 …

FPGA 图像亮度、对比度、饱和度调节

1 亮度 1.1 亮度简介 亮度是指图像的光度学或感觉上的属性&#xff0c;它反映了图像的明暗程度。在图像处理中&#xff0c;亮度通常用灰度值表示&#xff0c;灰度值越高&#xff0c;图像看起来越亮&#xff1b;反之&#xff0c;越低则越暗。 对图像进行亮度调节&#xff0c;…

宝塔一键迁移报错创建失败问题完美解决

很多站长朋友在使用宝塔面板迁移的时候总是出错&#xff0c;如图&#xff1a; 遇到这样的问题不要慌&#xff0c;我们已经完美处理&#xff0c;详细解决教程&#xff1a;宝塔一键迁移报错问题完美解决教程

力扣爆刷第90天之hot100五连刷36-40

力扣爆刷第90天之hot100五连刷36-40 文章目录 力扣爆刷第90天之hot100五连刷36-40一、94. 二叉树的中序遍历二、104. 二叉树的最大深度三、26. 翻转二叉树四、101. 对称二叉树五、543. 二叉树的直径 一、94. 二叉树的中序遍历 题目链接&#xff1a;https://leetcode.cn/proble…

【洛谷千题详解】P1838 三子棋I

题目总览 题目描述 小 a 和 uim 喜欢互相切磋三子棋。三子棋大家都玩过是吗&#xff1f;就是在九宫格里面 OOXX&#xff08;别想歪了&#xff09;&#xff0c;谁连成 3 个就赢了。 由于小 a 比较愚蠢&#xff0c;uim 总是让他先。 我们用 9 个数字表示棋盘位置&#xff1a;…

微信小程序跳转到其他小程序

有两种方式&#xff0c;如下&#xff1a; 一、appid跳转 wx.navigateToMiniProgram({appId: 目标小程序appid,path: 目标小程序页面路径,//不配的话默认是首页//develop开发版&#xff1b;trial体验版&#xff1b;release正式版envVersion: release, success(res) {// 打开成功…