观察者 - 显式指定感兴趣的修改 - JAVA 实现

2024-04-12

I asked here https://stackoverflow.com/questions/65198966/observer-pattern-observe-attributes-independently当我需要通知时我应该如何处理这种情况观察员仅当特定属性object变化。

我收到了非常好的回复,参考GoF https://en.wikipedia.org/wiki/Design_Patterns其中写着:

块引用 明确指定感兴趣的修改。您可以通过扩展主题的注册接口以允许仅针对感兴趣的特定事件注册观察者来提高更新效率。当此类事件发生时,主体仅通知那些对该事件感兴趣的观察者。支持这一点的一种方法是使用主题对象的方面概念。为了记录对特定事件的兴趣,观察者使用以下方法将其附加到他们的主题上:

void Subject::Attach(Observer*, Aspects interest);

块引用 其中interest 指定感兴趣的事件。在通知时,主体将更改的方面作为更新操作的参数提供给其观察者。例如:

void Observer::Update(Subject*, Aspect& interest);

这是有道理的,我想问一下如何在Java中正确实现这一点。我的想法很少,但我不确定是否有更好的东西。

让我们想象一下我有subject class WeatherStation[temperature, humidity, windSpeed ...]我有observer class LimitedDisplay[show (shows only temperature and humidity)由于某种原因,我需要显示器应该能够区分何时仅改变温度和何时仅改变湿度。

我想我可以创建一些枚举WeatherStationInterest[TEMPERATURE, HUMIDITY WIND_SPEED...]然后有这样的主题界面:

public interface WeatherStationSubject{
    registerObserver(WeatherStationObserver observer, WeatherStationInterest... interests);
    .
    .
    .
}

有人可以确认我这是正确的方法吗?或者建议我更好的解决方案。


另一种选择是拥有一组接口:

interface TemperatureListener {
    onTemperatureChange(double newTemperature);
}
interface HumidityListener {
    onHumidityChange(double newHumidity);
}
...

然后注册方法如下:

void registerListener(Object listener)

并且您将实现一个侦听器:

class MyListener implements TemperatureListener, HumidityListener {
...
}

不一定更好,但可以轻松查看实际发生的变化(如果这很重要)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

观察者 - 显式指定感兴趣的修改 - JAVA 实现 的相关文章

  • Amazon Elasticache Redis 集群 - 无法获取端点

    我需要获取 Amazon Elasticache 中 Redis 集群的终端节点 以下代码适用于 Memcached 集群 但不适用于 Redis import com amazonaws auth AWSCredentials impor
  • 如何抑制 Cucumber/Junit 断言堆栈跟踪

    我有一个黄瓜场景 该步骤使用assertEquals 我的结果报告显示了对最终用户不友好的堆栈跟踪 我怎样才能抑制它 Scenario Add two numbers Given I have two inputs 3 and 2 When
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • HttpSession 内的同步是否可行?

    UPDATE 问题后立即解决 问题 通常 同步是在 JVM 内序列化并行请求 例如 private static final Object LOCK new Object public void doSomething synchroniz
  • Ant 中回显目标描述

  • 为什么Java中的文件名与公共类名相同? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在Java中 文件名应该与文件名相同public class包含在该文件中 为什么这是一个限制 它有什么目的 Java 有一个有趣的方法 如果给
  • 进度状态报告模式

    我正在实现需要显示进程栏 或进度百分比 的长时间运行的进程 长时间运行的过程的整体逻辑很复杂 各种分页数据检索 因此 我最终在代码中的不同位置硬编码了大量百分比 在更新完成百分比时 什么被认为是最佳设计模式 我发现 JFace 周围使用的模
  • 使用 equals 方法比较两个对象,Java

    我有一个对象数组 我想将它们与目标对象进行比较 我想返回与目标对象完全匹配的对象的数量 这是我的计数方法 public int countMatchingGhosts Ghost target int count 0 for int i 0
  • 开发人员实际上是否使用 vim 在 Windows 操作系统上编写代码(Java)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在Java中将日期“2020-05-22T12:51:20.765111Z”解析为Instant [重复]

    这个问题在这里已经有答案了 如何解析 2020 05 22T12 51 20 732111Z Java 中的 Instant I used LocalDateTime parse startTime DateTimeFormatter of
  • 单元测试、集成测试还是设计中的问题?

    我编写了我的第一个单元测试 我认为它过于依赖其他模块 我不确定是否是因为 这是一个复杂的测试 我实际上已经编写了集成测试或 我的设计有问题 我首先要说的是 虽然我有大约 4 年的开发经验 但我从未学过 也没有人教过自动化测试 我刚刚使用 H
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • Java 常量枚举[重复]

    这个问题在这里已经有答案了 可能的重复 理解 Java 中的枚举 https stackoverflow com questions 1419835 understanding enums in java 为什么我们应该使用枚举而不是 Ja
  • 用于安装 R 软件包的备用编译器:clang:错误:不支持的选项“-fopenmp”

    我正在尝试在 OS X 10 11 6 上使用 R 版本 3 4 0 安装 rJava 包 install packages rJava type source 我收到以下错误 clang o libjri jnilib Rengine o
  • 如何在启用嵌入时间戳和 LTV 的情况下签署 PDF?

    我正在尝试签署启用了时间戳和 LTV 的 pdf 以便它在 Adob e Reader 中显示如下 在英语中 这意味着 签名包含嵌入的时间戳 和 签名启用了 LTV 这是我正在使用的代码 PrivateKey pk get pk from
  • 线程上下文类加载器和普通类加载器的区别

    线程的上下文类加载器和普通类加载器有什么区别 也就是说 如果Thread currentThread getContextClassLoader and getClass getClassLoader 返回不同的类加载器对象 将使用哪一个
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • 一个类中有多个具有相同参数类型的方法

    我知道 至少已经有了关于这个主题的一个问题 https stackoverflow com questions 5561436 can two java methods have same name with different retur
  • 设置 Firefox 配置文件以使用 Selenium 和 Java 自动下载文件

    我想使用 Selenium WebDriver 和 Java 验证文件下载 要下载的文件为 PDF 格式 当 WebDriver 单击 AUT 中的 下载 链接时 Firefox 将打开以下下载确认窗口 我希望 Firefox 自动下载文件

随机推荐

  • CSS:如何使盒子内部的角变圆? [复制]

    这个问题在这里已经有答案了 有border radius属性为圆形框角 但是如何在块内圆角 例如减去圆 像这儿 http malsup com jquery corner http malsup com jquery corner 卷曲设置
  • preg_match_all() 在不同的服务器上表现不同

    下面的代码在我的 PC 上的 XAMPP 上运行完美 但在我新购买的 VPS 上不起作用 它使我的代码崩溃了 preg match all regex siU string matches PREG SET ORDER 这预计只是从 HTM
  • 如何从 Android 中的自定义 CameraView 捕获图像?

    我需要捕捉图像 from 所需部分 of the screen 捕捉图像 from camera 当时其他屏幕内容保持原样 这怎么样possible 尝试使用表面视图 for 创造动态 camera查看并设置您需要的部分 下面的代码尝试 变
  • 从 pthread 调用 sleep() 是否会使线程或进程进入睡眠状态?

    我看到有一个关于linux pthread睡眠 https stackoverflow com questions 3633089 pthread sleep linux 然而 当我在 Linux 机器上查找手册页时 我看到以下内容 概要
  • 在 Mac OS X 的 Swing 应用程序中嵌入 JRE

    我必须发布带有嵌入式 JRE 的 swing 应用程序 包含应用程序 JRE bat sh 的压缩存档可以在 Windows 和 Linux 上实现 用户下载 zip 文件 解压缩并启动应用程序 完美的 但现在 我必须为 Mac OS X
  • Angular 7 组件测试使用原始服务而不是模拟服务

    我正在尝试测试具有注入服务的组件 我想在我的测试中提供模拟服务 然而 测试使用原始服务而不是模拟服务 我知道这一点是因为我收到 没有 HttpClient 的提供程序 错误 而且我在测试中输出的原始服务中有一个 console log 我可
  • 委托不接受子类?

    我的委托似乎不接受子类 我认为一个例子是最简单的 public class A public A public class B A public B public class Program private delegate void Ca
  • 如何在 ipyparallel 客户端和远程引擎之间最好地共享静态数据?

    我在具有不同参数的循环中运行相同的模拟 每个模拟都使用 pandas DataFrame data 只能读取 不能修改 使用ipyparallel IPython并行 我可以在模拟开始之前将此DataFrame放入我视图中每个引擎的全局变量
  • 谁将高级语言转换为汇编语言

    好吧 通过计算机指令 程序的基本功能 我了解到我们用高级语言编写源代码 编译器将其转换为低级语言 机器代码 目标代码 我还了解到汇编器将汇编语言转换为机器代码 目标代码 那么我就有以下疑问 如果编译器直接将高级转换为低级 则从生成该汇编语言
  • “重置”对象变量的“Pythonic”方式?

    我认为 这里的 变量 指的是 名称 不完全确定pythonistas使用的定义 我有一个对象和一些方法 这些方法都需要并且都改变对象的变量 我怎样才能以最Pythonic和最好的方式 尊重OOP的技术 实现让方法使用对象变量 同时又保留其他
  • 嵌套表格中的长字换行

    我正在尝试总结一个很长的词 我看过这个帖子 如何防止长单词破坏我的 div https stackoverflow com questions 320184 how to prevent long words from breaking m
  • 生成谷歌地图图像[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想允许我的网站的最终用户生成谷歌地
  • 如何使用Logback以JSON方式登录?

    我是 SLF4J 和 Logback 的新手 我正在尝试记录以下 API 的每个请求和响应link https pivotal io de application transformation recipes observability r
  • 内容可编辑和非按钮元素

    如果使用按钮 我可以轻松地对内容可编辑的选择执行 execcommand 但是使用任何其他元素都会失败 http jsbin com atike edit http jsbin com atike edit 为什么会这样以及如何使用 div
  • 具有通用向量和对类型的对向量,模板的模板

    我想将一个成对的向量传递给一个函数 实际的向量实现以及对的类型应该是模板参数 我想到了这样的事情 template
  • jquery - firefox 中的 event.preventDefault()

    我有问题event preventDefault 在 Firefox 中 它不起作用 这是 jquery 代码 facebook del 1 click function event preventDefault var selector
  • MVC(模型-视图-控制器)——能用简单的术语解释一下吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我需要向一位不太懂技术的经理解释 MVC 模型 视图 控制器 概念 但遇到了麻烦 问题是解释需要处于 你的奶奶会明白的 水平 例如即使是相当简单的解释
  • 如何快速发送自动短信? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在我的应用程序中自动发送短信 我怎样才能快速做到这一点 我使用 MFMessageComposeViewController 发送
  • 对 Map 列表进行排序

    我有一个像这样创建的列表变量 List
  • 观察者 - 显式指定感兴趣的修改 - JAVA 实现

    I asked here https stackoverflow com questions 65198966 observer pattern observe attributes independently当我需要通知时我应该如何处理这