问题标签 [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 投票
0 回答
39 浏览

python - 在方法的多次调用中使用的参数的条件:由调用者或方法强制执行?

假设我有一个A类的对象A。它有一个方法需要以特定类型的另一个对象的形式提供参数 - 但参数也应该处于特定状态,因为该方法执行的操作(假设它正在查询外部服务,但它可能是其他东西) 需要它。

我想到的第一个解决方案很简单:该方法应该对输入数据强制执行一个条件。它应该测试它的所需状态,然后引发异常或修改状态:

但是,我们正在谈论的实例只是A的众多实例之一。所有这些实例都应该对输入数据执行相同的操作:针对特定状态对其进行测试,然后强制执行,或者只是引发异常。似乎他们可以使用参数的共享实例,其所需状态已由外部调用者强制执行,B 类实例:

因为我认为如果不在方法内部强制执行所需的参数状态,则方法执行的操作不会被正确封装,我认为应该将其移至前调用者。对象a类 A的所有其他实例只会提供执行操作所需的数据。

但是,还有另一个问题:该操作返回一个值,该值可以以与A实例相关的方式解释以获取另一条数据 - 现在似乎操作 do_something 应该封装在类 A的方法中。

我应该如何解决这个问题?我是否应该简单地保留当前设计并使对象成为可用于解释操作提供的返回代码的返回数据?也许我应该使用命令链模式并修改A 类以将操作委托给 A 的其他实例?我还有什么其他方法可以处理它?

0 投票
1 回答
277 浏览

events - 责任链与事件

我总是怀疑何时选择这两种模式中的一种。例如:假设我有一个输入管理器,当我按下一个按钮时,我希望主玩家执行跳跃动作。在这种情况下,我可以使用 2 种不同的解决方案:

  1. 我有一个 inputManager 告诉 GameManager 刚刚添加了什么,而 gameManager 告诉 Player-manager 采取行动。所以它类似于: inputManager ---> Game manager ---> Player-manager 这就是责任链模式。
  2. PlayerManager 在 inputManager 上注册跳转事件以接收输入,并且 PlayerManager 自动执行其跳转例程。

所以我的问题是:为什么我会选择一种模式而不是另一种模式?两者各有利弊,那么当您遇到这种情况时,您首选的解决方案是什么?

0 投票
1 回答
1038 浏览

c# - 在责任链模式中使用共享组件的最佳方式

我对责任链模式有疑问。所有处理程序都实现这个类:

然后我实施DocHandler

CloudHandler

我的问题是找到在处理程序之间共享方法和属性的最佳方式。现在我使用静态类 SharedComponents,每个处理程序都委托自己的方法。

在 DocHandler 中,我委托方法SharedComponents.GetDoc = this.GetDoc;,然后在 CloudHandler 中使用它var Model = SharedComponents.GetDoc(docid)。这是将委托写入数百个共享方法的意大利面。

但是我是如何测试的呢?我将必须初始化所有处理程序(因为A使用方法BB可能使用方法C等)以在一个处理程序中测试一种方法。恐怖!

我尝试将共享方法设置为静态以使用 like var Model = DocHandler .GetDoc(docid)。但是这个解决方案打破了依赖倒置原则。如果某些共享方法使用上下文(如sessionin UnitOfWork),我需要在测试中再次初始化所有处理程序!

0 投票
1 回答
957 浏览

java - 责任链 - 通过所有链传递请求

我浏览了网页,但我找不到我的问题的答案...

假设我有 3 条链。我希望请求通过所有 3 个链(链是否可以处理请求并不重要)。是否可以使用 CoR 模式来解决这个问题?

为了更好地解释它 - 我有一个必须通过几组规则的列表。如果它通过了第一条规则,列表保持不变。然后它继续到第二条规则,第二条规则改变了一个列表。更改后的列表进入第三条规则,它通过并保存更改后的列表。 链条

0 投票
1 回答
175 浏览

swift - Swift 编译器无法解析泛型的递归使用

我正在尝试在 Swift 中实现责任链模式。

我的课程没有引发任何编译错误,但一个简单的用例(如下面的)不起作用。它引发以下错误:error: cannot invoke 'endWith' with an argument list of type '((_?) -> ()) ; expected an argument list of type '((U?) -> Void)'

任何想法?

我知道这是 Swift 中泛型使用的一个极端案例。但是,由于不可能显式地专门化泛型类型,所以到目前为止我还没有找到任何解决方案。

0 投票
1 回答
920 浏览

design-patterns - 责任链 VS 案例陈述

当我读到责任链时,它谈到了将客户端与数据的实际处理分开。所以它说客户端程序调用链的第一个成员,该成员确定它是否可以处理请求,如果可以,则处理它,如果不能,则调用链的下一个成员,依此类推。

我已经读过可以将其他成员添加到链中,并且客户端程序不必实际更改即可处理。我在包括 Wikipedia 在内的示例中看到的是,客户端必须实例化链的每个成员,甚至为链的每个成员设置后继。

当链中对象的顺序由客户端确定并且客户端甚至必须实例化链中的每个对象时,这如何被认为是松散耦合?

0 投票
1 回答
65 浏览

c# - 责任链 - Servicer1 未调用 Servicer2

我试图通过在 Servicer 类字符串中搜索字符/字符串来演示责任链模式的使用。代码运行,但 Servicer1 ServiceReq 未调用 Servicer2 ServiceReq。如果我用“g”运行它,我只会得到“Checked Servicer1'”,但我应该得到“Checked Servicer1'”“在 Servicer 2 中找到请求”。

表格代码:

0 投票
1 回答
119 浏览

oop - 用于在不同“输出级别”上执行请求的设计模式

我正在解析一个字符串,例如:

成一个复合数据结构,它包含1n 个参数,它们是requestLeaf 对象,这些参数可以是requestLeaf 对象(如果它只是纯文本,应该像上面那样返回(“hello world”))或另一个requestComposite 对象(如果有一些计算正在进行(如读取-> 客户),直到它再次变成纯文本。

我想要实现的是遍历整个组合,以便它呈现某种文档。

第一个组合的参数或叶子代表打印到文档的或级别 0。 我想为此使用图书馆。这个库可以处理打印文本、图像等,但不能评估任何东西!

Everything > Level 0应该在另一个库中计算。
这个库可以读取成员值,做一些数学运算等,并将其最终值(仅是字符串)返回到要打印的根。
其他所有内容都通过例如 \img() 或 \text() 显式打印

可能有一个

用于查找成员值 X 的标记,
该值应隐式打印(不将其包装到另一个 \text() 中)!

可能有一个 \list() 令牌通过指定的成员列表循环其参数,如:

X 可能是另一个 Y

换句话说:我不知道结构会有多深。

碰巧我对设计模式和 OO 还很陌生。
我现在正在摆弄“执行”的责任链模式,其中渲染/输出库和计算库正在构建处理程序链。
但我有点好奇 CoR 是否真的能满足我的需求:

你会如何解决这样的问题?

编辑:我现在的方法

  1. 遍历复合材料。
    传递一个 包含输出库计算库的中介对象。

  2. 如果当前叶子是文本
    检查当前是否是根
    如果不是访问计算库以评估实际值并将其传递给它可能关注的人(例如\read(),\varput(),...)
    如果是访问输出库打印出来

我想到的是,我必须在两个库中实现每个 requestMethod 才能实现自动根打印。即输出
中的\read()应该将文本打印到文档中, 计算库中的\read() 应该查找成员值。

我在这里把事情复杂化了吗?

0 投票
1 回答
6678 浏览

java - 责任链——lambda函数实现

您将如何在 Java 8 中使用 Lambda 实现责任链模式?


我在这篇文章中只找到了一段:

责任链

一个 lambda 可能会或可能不会委托给另一个 lambda,它可能会或可能不会委托给另一个 lambda,无穷无尽。(如何获取 lambda 的“下一个”引用留作读者练习。)

0 投票
0 回答
126 浏览

java - 责任链可以有前任吗

责任链可以有前任,还是应该只有链中的继任者。我的意思是,如果我们需要调用链中的先前对象。可能吗。据我在网上看到的,只有继任者。将建立一个前任断链。例如,

实际问题是如何使用给定的对象链匹配“r”和“o”。

在这里我需要匹配给定的字符串。object1 将返回“c”的位置。object2 将匹配“a”。如果它是 true ,它应该传递以匹配“r”到链中的下一个对象。如何在不使用前任的情况下做到这一点。请帮忙。