观察者模式应该包括一些无限循环检测吗?

2023-12-01

快速浏览一下GoF和Head First Design Patterns这本书,似乎没有提到观察者模式的无限循环检测和处理?

我认为如果是在2个类之间,我们可以更加小心无限循环问题,但是如果有5个类或12个类,并且观察者走向多个方向怎么办?在这种情况下,是否会出现无限循环并且应该在该模式中添加一些检测?


只有在以下情况下才会发生无限循环:(a) 观察者也是可观察的,(b) 他们观察到的变化可以导致自身变化,(c) 观察图是循环的,并且 (d) 存在一种最终可能发生的变化引发同类的变化。理想的解决方案是通过确保不存在这些要求之一来设计消除无限循环的风险。如果您当前的设计使所有四个都为真,请看看是否可以更改它以使其中之一为假。

Observer-Observable 的传统用途是在分层架构中 - 例如,视图控制器观察模型对象,或者事件处理程序观察 GUI 组件 - 并且这里的图不会是循环的,因此不存在无限循环的风险。

我或许应该解释一下 (d) 点,即不同类型的变化。我的意思是,如果你遇到这样的情况,比如 UserInputEvent 可以触发 ModelStateChangedEvent,而 ModelStateChangedEvent 可以触发 WidgetUpdateEvent,而 WidgetUpdateEvent 本身不能触发任何内容,那么即使观察者形成循环图,你也永远无法获得无限循环,因为事件序列中只有有限数量的阶段。实际上,事件形成了非循环图,即使观察者不这样做。但是,如果一个 ModelStateChangedEvent 可以触发另一个 ModelStateChangedEvent,那么您就有循环的风险。

如果你确实无法避免周期风险,那么你可以借鉴乔恩·波斯特尔,并使每个事件通知都带有一个整数生存时间计数器。当 Observable 广播“原始”事件(即来自观察者网络外部的事件并在其中引发一系列事件)时,它会将计数器设置为某个合适的初始 TTL 值。当 Observable 通过广播另一个事件来响应一个事件时,它将使用比触发事件小 1 的 TTL。当观察者收到 TTL 为零的通知时,它会忽略它。这可以防止无限循环,但也会阻止观察者“正确”响应某些事件,因此需要谨慎使用。我强烈建议,达到 TTL 限制的事件级联应被视为编程错误的结果,并且应以与处理 NullPointerException 或断言失败等情况相同的方式进行记录和报告。

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

观察者模式应该包括一些无限循环检测吗? 的相关文章

  • 为什么所有的 Active Record 都讨厌? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 呈现模型与被动视图

    我想知道上述两种模式之间的区别 当您考虑到您需要在表示模型模式中同步代码并且该代码位于表示模型本身中时 那么我认为这些模式非常相似 两者都将事件委托给演示模型 演示者 演示模型和演示者命令域模型 并且也观察域模型 当发生更改时 它们都与视图
  • 门面模式和业务委托模式之间的区别

    外观设计模式和业务委托设计模式有什么区别 它们不是都用于向客户端隐藏业务逻辑吗 委托位于客户端和实际实现之间 通常对客户端隐藏 过滤 增强实现的某些功能 Facade 提供了一个粗粒度的 API 隐藏了更复杂的逻辑和 或协调 通常捆绑多个协
  • 验证日期 - Bean 验证注释 - 使用特定格式

    我想验证日期格式YYYY MM DD hh mm ss Past validates for a date that is present or past But what are the formats it accepts 如果那不可能
  • C++11 的 &&(R 值引用)运算符是否废弃了“代理对象”设计模式?

    Scott Meyers 的第 30 项 更有效的 C http www amazon co uk More Effective Programs Professional Computing dp 020163371X绘制出 代理对象 编
  • 如何使用工厂来创建使用策略模式的对象?

    假设我们的在线商店有一个简单的支付功能 我们希望使用不同的交易处理器来管理不同的交易 交易可以是付款或退款 交易处理器可以是 Paypal 或 Payplug 所以我们有以下课程 class PaymentTransaction imple
  • 实体框架的状态模式

    我有一个模型Enquiry 它可以处于两种状态之一 还有更多状态 但出于此目的 我将仅比较两种状态 New and Closed 查询所处的状态取决于用户能够对查询执行什么操作 例如 无法删除已关闭的查询 而可以删除新的查询等等 基本示例
  • 这是一个不正确的警告吗?

    让我们看看我经常看到的这个代码模式 struct Foo template
  • SQL Server T-SQL 中的 REGEXP_LIKE 转换

    我在一份需要转换为 SQL Server 的旧报告中遇到了这一行 REGEXP LIKE examCodes learner code examCodes 是源 learner code 是模式 我知道 SQL Server 没有 REGE
  • 横切关注点示例

    什么是一个很好的例子cross cutting concern 医疗记录示例维基百科 http en wikipedia org wiki Cross cutting concern页面对我来说似乎不完整 具体来说 从这个例子来看 为什么日
  • 用简单的英语来说,什么是单例?

    我已经在谷歌上搜索了大约一个小时 但我仍然不清楚什么是单例 谁能让我更清楚一点 也许可以发布一个代码示例 我所知道的是 一个给定类只能有一个实例 但是你不能为此使用静态类吗 提前致谢 The simple plain English1 ve
  • Javascript 沙箱模式示例实现

    在 Stoyan Stefanov 的伟大著作 JavaScript Patterns 的第 101 页中 他解释了沙箱模式 我非常喜欢他的书 但我真的错过了一些现实生活中的例子 然后更好地理解他所谈论的内容 我正在寻找一个现实生活中的工作
  • STL(标准模板库)中使用的设计模式

    我正在学习STL和设计模式 我想知道是否有任何文档或链接可以解释如何在 STL 中实现设计模式 我做了谷歌但无法获得太多数据 我希望你的意思是 哪些设计模式可以在STL中识别 STL 堆栈是一个容器适配器 适配器是一种设计模式 迭代器也是一
  • 确定方法调用顺序的接口设计模式

    我想创建一个具有多种方法的 Java 接口 但我希望界面的用户只能按照我定义的顺序或顺序调用方法 例如buyTicket 不应在此之前调用reserveTicket 问 有没有设计模式或任何关于如何做到这一点的提示 我考虑过 A 接口被包装
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • MVVM ViewModel 与 MVC ViewModel

    ViewModel 是一个在 MVVM Model View ViewModel 和 ASP NET MVC 的推荐实现中使用的术语 鉴于每种模式都使用相同的术语 研究 ViewModel 可能会令人困惑 MVC ViewModel 和 M
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • 工厂模式中创建者的角色

    我无法理解为工厂类定义抽象类 接口的作用 这是我在网络上的所有教程中总是看到的东西 有人可以阐明 CreatorInterface 的重要性吗 工厂模式参考UML图 https i stack imgur com 3VpUM png 为了以
  • 使用接口或函数对象进行回调? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在面向对象中 通常使用接口来实现回调 粗略示例 class Message class IMsgProcessor public virtual

随机推荐

  • 将随机森林预测作为列添加到测试文件中

    我在 python 中工作pandas in a Jupyter笔记本 我在其中为泰坦尼克号数据集创建了一个随机森林模型 https www kaggle com c titanic data 我读入测试和训练数据 然后清理它并添加新列 两
  • 使用node/js/MySQL工作台将变量传递给查询字符串

    问题 将变量传递到插入语句时 我在数据库中收到空插入 变量有名字 姓氏 电子邮件 密码 我所知道的 我知道我正在获取用户输入表单数据 我正在安慰它们在插入语句之前存储的变量 该语句起作用并将表单数据打印到控制台 当表单在网页上提交时 它存储
  • C# 中两个进程之间的同步。

    有什么办法可以让我们同步两个独立的进程吗 就像如果他们共享资源一样 我想同步它们 我正在使用 C 你可以使用 Mutex 类 请参阅此处的文档 http msdn microsoft com en us library system thr
  • 如何制作库存物品标签 (IN619200) 为收到的每件物品打印一个标签?

    开箱即用Acumatica Inventory Item Label报告 IN619200 旨在仅当项目序列化时才在收据上打印该行项目的多个标签 我们将修改报告 允许用户选择收据编号 并让系统根据每件商品收到的数量生成标签数量 无论它们是否
  • 在 jPanel 周围拖动/移动形状

    昨天我问了一个关于如何绘制边界框以在内部容纳形状的问题如何拖放所选形状 第一个问题就解决了 但我在移动形状时遇到了一些麻烦 是否有任何特定的转换可以在 jPanel 周围移动形状 我有这个代码 public boolean drag Mou
  • Qt 5.2.0 缺少相机服务

    我有一个罗技高清网络摄像头 C270 我想编写一个简单的网络摄像头应用程序 因此我尝试编译 Qt 摄像头示例 Qt Qt5 2 0 5 2 0 msvc 2010 opengl examples multimediawidgets came
  • 如何在sql server中使用like运算符选择匹配百分比高于其他记录的记录?

    我有一组记录需要使用条件进行搜索 但标准返回我多行 因此 我需要具有最大标准匹配百分比的前 2 条记录 我研究了模糊逻辑 但发现对于如此简单的问题来说它太复杂了 我有如下场景 SELECT DISTINCT FirstName LastNa
  • 根据深色或浅色模式更改样式

    我想在我的 Vue 应用程序上有一个深色和浅色主题 我可以创造dark scss文件并更改类样式和使用 important属性来覆盖组件中定义的样式 或者我可以使用props在我的组件中并更改 classNamev if根据主题 例如将类别
  • Microsoft Bond 架构演变最佳实践

    Microsoft Bond 是否有一些关于架构如何随时间演变的最佳实践 我想确保我们遵循最佳实践 以便我们具有两种方式的兼容性 即允许我们的 Bond 类型将旧版本演变成当前版本 以及向后兼容性允许从较新版本转换回旧版本 我没有在文档中看
  • .net core AsyncLocal 失去了价值

    我使用类似的模式HttpContext访问器 简化版本如下 Console WriteLine SimpleStringHolder StringValue 不应该为空 public class SimpleStringHolder pri
  • 如何查看mysql中索引的大小(包括主键)

    2个常见的答案是使用显示表状态 and INFORMATION SCHEMA TABLES 但似乎 他们都没有计算主键的大小 我有包含数百万条记录的表 带有主键且没有其他索引 上面提到的两种方法都显示Index length 0对于那些桌子
  • 试图获取非对象 SimpleXML 的属性?

    我当前正在使用以下代码从 REST api 检索信息 url http api remix bestbuy com v1 products 28upc upc 29 apiKey API KEY xmlfiledata file get c
  • 如何将函数应用于 data.frame 的每个元素?

    我想将一个数值转换为一个因子 如果该值低于 2 则 down 应该是因子 如果它高于2 则 up 和 no change 之间 到目前为止我考虑过创建一个函数 classifier lt function x if x gt 2 retur
  • APDU 在 mifare classic 上写入块命令

    我一直在尝试将一些数据写入我的 Mifare 经典卡 首先我发送这两个命令 返回 90 00 加载 Mifare 钥匙 FF 82 20 01 06 FF FF FF FF FF FF 认证 FF 86 00 00 05 01 00 01
  • 制作 iPhone 应用程序时是否可以嵌入或加载 SWF(Apple 是否允许)

    我对在为 iphone 制作应用程序时是嵌入 swf 还是加载它们有点困惑 有谁知道每个的优点是什么 最好使用哪个 我知道嵌入 swf 应该比加载它们快一点 但这就是全部吗 另外 这一点很重要 我读到苹果将拒绝任何带有外部 swf 的应用程
  • Android 中读取文本文件并以 TextView 形式输出

    我正在尝试读取已保存在我的目录中的文本文件并将其作为 TextView 打印在屏幕上 这是我到目前为止所拥有的代码 但是 当我运行该应用程序时 它会创建一个 toast 上面写着 读取文件时出错 我在这里做错了什么 public class
  • 数据网格视图更新

    我在 C 中使用 2005 Windows 窗体 我只花了一天的时间 所以请放轻松 我想要一个提交按钮来保存对 DataGridView 的更改 我已将数据存入 DGV 并可以编辑 但卡在 Update 上 我创建了一个名为 scDB 的
  • $.browser 的替代品是什么

    jQuery 文档标签 browser已弃用 那么它的替代品是什么 基于jQuery 迁移插件 我找到了这个 jQuery uaMatch function ua ua ua toLowerCase var match chrome w e
  • INotifyPropertyChanged 不会导致此代码中的屏幕更新

    下面的代码是基于此post 我的问题 我看不出我做错了什么来让 INotifyPropertyChanged 导致 textBox1 绑定自动反映这个简单示例中的更改 XAML 我添加了 textBox2 以确认属性正在更改
  • 观察者模式应该包括一些无限循环检测吗?

    快速浏览一下GoF和Head First Design Patterns这本书 似乎没有提到观察者模式的无限循环检测和处理 我认为如果是在2个类之间 我们可以更加小心无限循环问题 但是如果有5个类或12个类 并且观察者走向多个方向怎么办 在