问题标签 [chain-of-responsibility]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
381 浏览

wpf - wpf 事件和责任链模式

来自 wpf 的路由事件与责任链模式有什么共同之处吗?

我用谷歌搜索了这个,我没有看到有人在谈论这个:S,尽管我认为路由事件是该模式的实现

0 投票
2 回答
614 浏览

wpf - WPF 中使用的模式

大约一年来,我一直在更多地参与 WPF。很多东西都是新的,有时我很难理解它。

同时,我正在重读 GOF 设计模式这本书。

有几次我会在中间停下来,因为我会意识到某种模式正是某些 WPF 功能中使用的模式。每当有这样的认识时,我都觉得自己对相关WPF原理的理解有了很大的飞跃。这有点像啊哈效应。

例如,我还意识到我更容易理解 Prism,因为文档在解释所涉及的模式方面做得非常好。

所以这是我的“问题”(更像是一种努力):

为了帮助我们所有人更好地理解 WPF,如果任何人也“发现”了 WPF 中的设计模式可以给出一个简短的解释,那就太好了。

我发现的一个非常明显的例子是路由事件:

如果子控件检测到事件并且没有指定处理程序,它将把它传递给它的父控件,依此类推,直到它最终被处理或不再找到父控件。

假设我们在窗口内的 StackPanel 内的按钮上有一个图像。如果用户单击图像,则事件将由它处理(如果已指定处理代码)或“冒泡”直到其中一个控件处理它为止。因此,每个控件将有机会按此顺序做出反应。

  1. 图片
  2. 按钮
  3. 堆栈面板
  4. 窗户

一旦控件处理它,冒泡就会停止。

这是简短的解释,更准确的解释请参阅 WPF 文献。

这种功能代表了“责任链 设计模式”,它指出,如果它们是一个请求,它会沿着责任链传递,给其中的每个对象一个处理它的机会。请求的发送者不知道谁来处理它,这确保了解耦。有关更详尽的解释,请点击链接。

这里的目的只是为了展示这个(看似古老的 10 多年)想法如何进入我们当前的技术,并提供另一种看待它的方式。

我认为这足以开始,并希望在这里收集更多的相似之处。

干杯,托尔斯滕

0 投票
3 回答
6963 浏览

design-patterns - 这会是一个管道、一个责任链还是其他什么?

我正在构建一个多进程架构,它似乎是管道和责任链的奇怪融合。本质上,我有一个由队列链接的处理程序链。每个处理程序将接收一个表示输入数据的对象,将其转发给下一个处理程序,以便它可以开始处理它,然后确定它是否可以对该数据执行任何操作。

我不相信我可以将其称为管道,因为一步并不真正依赖于下一步。这似乎也不是传统的责任链,因为一个处理程序无法阻止其他处理程序处理该数据。这个设计有一个名字可以帮助我记录这个架构吗?还是我只能将其称为“责任管道”?

0 投票
3 回答
3558 浏览

design-patterns - 复合+责任链示例

谁能给出一个结合使用设计模式 Composite 和 Chain of Responsibility 的实际例子?

谢谢

0 投票
3 回答
3857 浏览

c# - 带代表的 C# 责任链

为了我的理解目的,我已经实现了责任链模式。

问题

在不破坏责任链的情况下,我如何应用委托和事件来重写代码?

0 投票
9 回答
77588 浏览

java - 在 Java 中避免使用 instanceof

拥有一系列“instanceof”操作被认为是“代码味道”。标准答案是“使用多态性”。在这种情况下我该怎么做?

基类有许多子类;他们都不在我的控制之下。类似的情况是 Java 类 Integer、Double、BigDecimal 等。

我确实可以控制 NumberStuff 等等。

我不想在几行就可以的情况下使用多行代码。(有时我会创建一个 HashMap 映射 Integer.class 到 IntegerStuff 的实例,BigDecimal.class 到 BigDecimalStuff 的实例等。但今天我想要一些更简单的东西。)

我想要这样简单的东西:

但是 Java 并不是这样工作的。

我想在格式化时使用静态方法。我正在格式化的东西是复合的,其中一个 Thing1 可以包含一个数组 Thing2s,而一个 Thing2 可以包含一个 Thing1s 数组。当我像这样实现我的格式化程序时遇到了一个问题:

是的,我知道 HashMap 并且更多的代码也可以解决这个问题。但相比之下,“instanceof”似乎如此可读和可维护。有没有简单但不臭的东西?

2010 年 5 月 10 日添加的注释:

事实证明,未来可能会添加新的子类,而我现有的代码将不得不优雅地处理它们。在这种情况下,Class 上的 HashMap 将不起作用,因为找不到 Class。一连串的 if 语句,从最具体的开始到最一般的结束,可能是最好的:

0 投票
2 回答
462 浏览

chain-of-responsibility - 责任链模式:拥有相互依赖的处理程序是一种好习惯吗?

我有这种情况:我有一个查询处理程序链,首先是查询缓存,如果缓存无法回答或答案陈旧,则打数据库,如果找不到答案或答案又过时了,然后查询远程 Web 服务。

但我不确定这是否是使用此模式的正确方法,因为工作流程几乎是固定的,并且缓存和数据库处理程序依赖于下一步的返回结果来刷新其记录。

0 投票
3 回答
215 浏览

java - 您想在这个责任链的 java 实现中更正和/或改进什么?

0 投票
1 回答
621 浏览

ruby - Ruby 中的责任链和 alias_method 问题

我正在尝试在 Ruby 和 ActiveRecord 中为多态对象实现责任链模式。我有几个问题。

  • 有时我在尝试 alias_method 时收到一个方法未定义的错误,我认为这是因为未加载类或其他原因,所以我明确地发送来获取方法
  • 我得到一堆无限链,其中别名函数(original_method)调用调用 original_method 的方法。我想知道这是否是因为当您为已被覆盖的方法设置别名时,您实质上是在使“original_method”成为别名方法的副本。
  • 我目前正在通过让像“chained”这样的函数返回具有所有已定义方法的 Setting 子类来解决此问题,但很好奇为什么类中的 alias_method 存在如此多的问题。

这是一个例子:

然后,我有一个设置对象:

0 投票
3 回答
2381 浏览

c# - C# - 当一个对象改变状态时,它是否应该负责创建一个历史对象?

这更像是一个架构/最佳实践问题,所以请随意添加您的两分钱。我知道我在标题中声明了状态,但这适用于对象的任何基本属性。我认为下面的帐户示例将有助于证明我的问题比状态更好。

这是一个示例 Account 对象:

现在假设我想开始记录每次使用此对象添加事务时的历史记录。

在这个级别上,我通常会向帐户对象添加一组历史事件,并添加一行代码在 AddTransaction() 方法中创建一个历史事件,如下所示

现在下一部分是问题开始出现的地方。假设我要进行批量发布,并且我想保留在此批量发布中更改了哪些帐户的记录,以用于报告之类的事情,或者我以后需要撤消它。所以我会创建一个这样的对象。

从这里我看到了一些不同的选项来处理这个问题,因为上面的示例代码无法处理它。

1) 在 Service 类型对象中创建一个函数,该函数遍历调用 AddTransaction() 方法的帐户列表,并创建与 HistoryGroup 相关联的历史记录

2) 将某种类型的 HistoryManager 对象与要添加的事务一起传递到 AddTransaction 方法中。然后该函数可以使用历史管理器来创建记录。

好的,这篇文章足够长了。如果我不够清楚,请告诉我。感谢您的输入。