问题标签 [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 回答
1792 浏览

design-patterns - 责任链设计模式和使用简单的 if-elseif-else 块有什么区别?

前几天我只是在查找责任链,我遇到了这个例子。

基本上,有一个抽象处理程序,然后是具体处理程序,每个处理程序都实现了父抽象处理程序的句柄方法。实现是这样的,首先检查此特定处理程序是否可以处理当前请求,如果不能,则将请求传递给其后继者。

现在,我也可以使用一个简单的 if-else 条件块来做同样的事情。以上面链接中的第一个示例为例,我将如何更改它:

现在,我的问题是,两者之间的根本区别是什么?如果我可以使用 if-else 块提供完全相同的功能,我是否应该使用责任链?哪一个在性能、内存消耗、可维护性和可扩展性方面更好?

0 投票
1 回答
146 浏览

java - Java ActionListeners 到独立类

有没有办法将 actionListener 类移动到独立类?

我使用 Java 和 MVC 设计模式做了一个例子。我有 3 个更改背景颜色的按钮。

这是模型

看法

控制器

现在我创建了一个处理按钮事件的接口

每个实现接口的类都处理 ActionEvent。如果不能,则传递给下一个类(作为责任链)

黄色字体处理程序

黑色字体处理程序

蓝色字体处理程序

最后我用 main 方法创建了类

有什么办法可以使这项工作?我不想有一个用于事件处理的内部类,其中包含多个 if blick。任何建议将不胜感激。

0 投票
1 回答
460 浏览

c# - 责任链绩效

我有想要修改应用责任链 (CoR) 模式的代码,但如果我有很多继任者,我对性能表示怀疑。首先,这是没有 CoR 的代码:

嗯,真的有很多 Operation 类:Operation_3,....Operation_N,可能在 11 到 15 个类之间,但此时只有 Operation_1 和 Operation_2。如果我想添加 Operation_3,那么我必须更新 OperationService 类,添加一个新方法:Exec_Operation_3(Data data)。

我看到所有方法都返回相同的类型(响应)并作为参数接收相同的类型(数据),Operation_1 和 Operation_N 的方法也将具有相同的签名,所以我想我可以这样重写代码:(解决方案 1 )

如果您看到我正在应用 CoR 模式,那么当我添加一个新的 Operation_X 类时,我不必修改 OperationService 类,我只需更新 OperationCaller 类。

但是在这个解决方案中,我只修改了 Operation_1 类(和 Operation_2,...,Operation_N),但是这个类的代码太多,阅读起来有点困难,所以我认为最好创建另一个类来使用 CoR 并创建一个实例Operation_1,..,Operation_N 在该类中,如下所示:(解决方案 2)

在最后一个解决方案中,我没有修改Operation_1,我只创建了一个层来解耦 OperationService(这是目标)。

但是我认为 Operation_1 实例 - 在最后一个解决方案中 - 或 IOperation 实例 - 在第一个解决方案中 - 是一个有点重的对象,并且 OperationCaller 创建了许多对象,所以我对此表示怀疑,我不知道这个实现/解决方案是否会有性能问题。

你怎么看。在这种情况下,我会遇到使用 CoR 的性能问题吗?如果不是,第一个(解决方案 1)或最后一个(解决方案 2)哪个解决方案更好?

0 投票
1 回答
210 浏览

oop - 责任链设计模式

我想对责任链模式有一个直观的感觉。我想一个很好的方法是了解一些现实世界的例子。你们能分享这样的例子吗?

这种模式的一个特点是,如果链有很多阶段,比如说超过 10 个,实现就会变得非常难看。你们怎么办?

0 投票
2 回答
166 浏览

design-patterns - 如何解耦过滤器/链中不同处理程序的输入参数?

我有一个过滤器列表。每个过滤器都有不同的职责并接受各种输入参数。界面如下所示:

我运行它:

要添加过滤器,我必须

  1. 修改上下文,例如添加一个带有getter 和setter 的私有字段。

  2. 更新 main() 以填充新的输入参数。

有没有办法解耦所有这些输入参数,以便不同的过滤器可以专注于他们需要知道的每个参数。我希望 main() 中的代码可以稳定。谢谢!

PS 某些过滤器可能没有任何输入参数。

0 投票
1 回答
113 浏览

c# - 如何摆脱责任链中的显式演员表?

我目前有一个责任链的实现,它返回实现 IResponse 的对象。

这个实现的目的是让我在需要时可以轻松地替换实现。问题是如果我想对对象做任何特定的事情,比如访问foo.SpecificMethod().

有没有办法让这个(Foo)演员消失?

编辑:可以使用动态变量来解决这个问题,但最好采用静态类型的方式来解决它。

0 投票
1 回答
967 浏览

c# - 将命令组合成链并并行执行

我正在寻找适合这种情况的模式。

我需要以这种方式从 HDD 处理文件。

  1. 加载文件
  2. 分析文件
  3. 根据分析结果验证文件
  4. 根据验证结果将文件导入应用程序

这个过程将来可能会改变。

我的想法是为每个文件操作(命令模式)创建命令。

  • 加载文件命令:IFileCommand
  • 分析文件命令:IFileCommand
  • 验证文件命令:IFileCommand
  • 导入文件命令:IFileCommand

代码:

我需要使用命令创建进程(命令链)。

我尝试为此目的使用责任链模式,但可能存在更好的模式或设计。

如果可能的话,我想使用 Rx 并且并行执行也会很好。

我想实现这一点:

有任何想法吗。

0 投票
0 回答
50 浏览

design-patterns - 在某些处理程序是独立的并且某些处理程序依赖于其他处理程序执行的情况下使用的正确模式

致力于重新设计一个系统,该系统计算一些给定输入的属性,作为一个像属性的对象。

我们正在使用处理程序来计算与属性相关的属性。每个处理程序负责计算单个属性属性信息。

问题: 1. 有些处理程序依赖于其他处理程序的输出(首先计算其他属性)。

建议的解决方案:我正在考虑在这里使用 CoR(责任链模式)。我的想法是仅将 CoR 用于依赖于彼此输出的处理程序。将独立调用其他处理程序。

有没有其他模式或更好的方法来完成?

不想整体使用 CoR,因为将来我们可能希望并行运行这些处理程序,如果我在这里使用 CoR 模式,这是不可能的。

对问题进行了更多思考,发现可能存在对多个处理程序的依赖。问题: 1. 每个处理程序可以依赖多个处理程序的输出(首先计算其他属性)。- 我能想到的解决方案是使用两个桶“完成”和“待定”。继续从待处理的存储桶中执行处理程序,除非处理程序被执行。

有没有办法解决这个问题?

0 投票
1 回答
1262 浏览

python - 使用协程在python中实现责任链模式

我正在探索 python 中的不同概念,并且碰巧阅读了一个可用于责任链设计模式的协程示例。我写了以下代码:

我在这里尝试做的是尝试创建一个责任链模式解决方案来处理不同类型的客户(白金、黄金、钻石、白银)。

因为那个客户有一个管道,我已经提到了处理不同客户的顺序。Customer().HandleCustomer 将通过管道发送一个自身的实例,该管道将检查其 custtype 是否匹配,然后进行相应处理,或者将其发送给其继任者(如果可用)

问题:问题是当我运行上面的脚本时,它将处理第一个白金客户,而不是黄金或未定义的客户。我假设这是因为他已经到了发电机的尽头。如何修改代码,以便每次它是客户的新实例时,它都会从一开始就通过管道?

0 投票
1 回答
800 浏览

c# - Modified Chain Of Responsibility

I quite understand the basics of the Chain of Responsibility pattern. However, I would like to ask if it is possible to set the next receiver in the sequence dynamically.

The basic idea is that depending on the sequence of the approver, it will instantiate the next object.

Below is the example:

Abstract Base Class

Officer approver class

Officer B Class

Approver Chain Class

Business Class

This means that the OfficerB class will process first. If it fails, it will go to OfficerA class.

Is there a way to tweak it to the desired logic as mentioned? If so, how is it done?