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

c# - 有没有我可以说唯一的解决方案是使用责任链模式的场景?

我正在阅读 COR(责任链模式),我觉得它就像系统级别的 if else 或 switch case 一样简单,并且这种模式可以很容易地被类似的模式(如工厂模式或复合模式)替换。

有没有什么场景或例子可以证明只有 COR 可以解决这个问题?

提前致谢

0 投票
0 回答
47 浏览

php - 使用新兴的业务需求条件清晰地构建可测试的模块化代码

我试图概念化为 Yelp 或 FB 签入类型系统之类的代码编写代码的最清晰方法,但也包含签出组件。我正在使用 PHP。

基本要求可能是:入住:如果是“建筑”类型,我需要

  1. 通过它的 UUID 查找实际建筑物以获取它的主键,我们将在签入时登录,以便稍后将它们拉入报告中(签入到建筑物“123 Main Street”)。
  2. 他们目前无法检查任何内容
  3. 他们必须在场地的 X 米范围内
  4. 如果他们不在 X 米范围内,则必须记录一个异常字符串来解释原因。

如果是“房间”类型,我需要

  1. 通过它的 UUID 查找实际房间以获取它的主键,我们将在签入时登录以稍后将它们拉入报告中(签入到“123 Main Street -> Room 212”)。
  2. 他们需要已经被检查到建筑物中
  3. 他们已经不能入住房间了

还有一个“退房”阶段,我提到了这一点,所以你可以理解它不像 Yelp 那样你只是说“我在这里”。签到不是一个单一的动作;紧随其后的是“结帐”,为简洁起见,我不会在这里介绍。我的问题是关于创建更简洁的控制器、方法和设计模式来构建满足上述要求的代码。

因此,请求发送 json,点击(Slim)应用程序,转到方法的控制器(在本例中为 Post)。我们有他们的 GPS 坐标、他们正在登记的建筑物/房间的 UUID、他们的 ID(通过身份验证)以及登记、建筑物或房间的类型。就像是:

我有能力检查它们与建筑物坐标的关系、查找建筑物 ID 等。我正在寻找有关如何使此代码简单、可维护和可测试的想法。一方面,您可以看到我的 switch 语句(far 代码块)是如何失控的,但我不知道如何构造它。这就是问题的症结所在

没有任何要求:(功能代码)

我试图避免使用 switch 语句,但在某些时候我必须使用一些东西来确定实例化的内容,对吧?多态在这里对我没有帮助,因为我知道它对很多 switch 语句都有帮助,因为我还没有对象。

所以,对我来说,这似乎很简单。不清楚的是何时我想添加一些要求。处理这种类型的结构的正确方法是什么(只涉及两种类型......这可能会很快失控)。

(功能代码)

基于设计模式,如果我需要添加另一个$type,我就在这里做,看起来还不错。但是......这是在一个控制器中......它正在滥用开关状态......而且由于实例化和传入的所有不同的东西,它看起来很脆弱/脆弱。

我有一个 DIC,但我不知道它能让事情变得更清晰。

虽然它会清除此处的代码,但我不想在实际模型中实例化任何类(例如,我不想在对象内创建“alreadyInTester”对象),因为我希望它是可测试的并且正在做这似乎会使测试/模拟变得更加困难。

话虽如此,测试也有同样的问题。这些不同的要求以及如何测试它们有很多依赖,以至于测试并不是很孤立。我可以模拟 alreadyInTest 和 building/room 对象以隔离 checkIn 方法,并单独测试 building/room,但是要一起测试它们,就像在集成测试中一样,现在我冒着不确定性测试的风险,因为我发现这是一个凌乱的方法。

我最后的想法是这样的,但我担心控制器过于肥大:(feaux code)

同样,我觉得我应该在别处抽象这两个 if/throws(每个案例),但这似乎并没有让这变得更简单(另外:我承认这不是一个复杂的例子......但是),并且控制器在这两个示例中都没有更瘦。我觉得最后一个例子对我来说更清楚。对我来说,关键在于每次添加某些内容时,都意味着向 switch 语句添加更多内容。我认为多态系统会更好,但是由于需要外部类来进行需求检查,因此无论如何我都必须实例化并传递大量对象,从而使其同样复杂。在每个签入对象中实例化类是不可测试的。我在想也许责任链或命令模式可能有用,但似乎不太合适。

我兜兜转转。

那么,这些是最好的方法之一,还是我可以做得更好?

0 投票
1 回答
624 浏览

java - 如何使用构造函数来构建责任链来初始化下一个链?

如何使用构造函数来构建责任链来初始化链。这是我的 Runner.class,我正在使用setNext 方法构建我的链。

这是我的处理程序抽象类

而且我也有它的实施。如何制作,它将通过构造函数初始化!请帮忙!

0 投票
1 回答
1083 浏览

design-patterns - 当每个请求只有一个处理程序时,为什么责任链不合适?

我目前正在为一个项目开发 USB 固件。在弄清楚如何最好地处理来自主机的服务请求时,我决定实施责任链模式。

在我的应用程序中,对于从主机检索到的每个请求,始终只有一个处理程序。所以基本上我提前设置了我的处理程序链,循环从等待主机的请求开始。请求被传递给“根”处理程序,后者通过检查请求的一部分来决定是处理它还是将它传递到链中。处理完请求后,我们将返回等待来自主机的另一个请求。

同样,只有一个处理程序会处理请求。未处理的请求,即遍历整个处理程序链,是错误条件。

www.sourcemaking.com阅读责任链模式后,这句话引起了我的注意(讨论部分的最后一段):

当每个请求仅由一个处理程序处理时,或者当客户端对象知道应该由哪个服务对象处理请求时,不要使用责任链。

为什么这是真的有一个很好的实际理由吗?在我看来,在作者警告的情况下使用责任链是完全有效的。谁能给我一些关于为什么这将是一个糟糕的设计选择的见解?

0 投票
0 回答
74 浏览

java - 说Java中异常的设计模式是“责任链”是否正确

说Java中的异常机制是“责任链”对吗?

一方面,据我了解,对于我们在 Java 中遇到的每个异常,我们“运行”“捕获块”并检查哪个负责处理它,这看起来像“责任链”

但另一方面,“捕获块”不是对象,责任链正在谈论“处理对象”。

那么我在这里想念什么?

当我写作 catch(Exception_class_Name ref){}时,这是否意味着我正在创建/实现某种类?因为我在网上找不到任何关于这个想法的建议

0 投票
1 回答
191 浏览

java - 责任链在这里有效吗?

我正在设计一个问题的解决方案,其中我有一个有分数的项目列表。例如。

这些项目必须经过一套黑匣子步骤..

评分项目---->第1步--(重新排名)--->第2步--(重新排名)---->第3步-(重新排名)--->最终结果

每个步骤都会根据它们的类型重新排列一些产品。例如。步骤 1 将确保电子产品进入前 10 名(它将使前 3 名固定的电子产品进入前 10 名)当第 2 步获得此列表时,它必须重新排名但不应该重新排列第 1 步确定的产品但是它应该在对其他人进行排名时考虑它。我在想责任链设计模式。你们觉得呢 ?

0 投票
2 回答
597 浏览

c# - 反向管道/责任链模式

我想知道是否有一种建立模式来控制我的应用程序将拥有的流程。

简单地说,它应该是这样的:

  • 用户提供文件
  • 正在处理文件
  • 用户收到处理后的文件

将有几个处理步骤,比如说 PreprocessingOne、PreprocessingTwo、PreprocessingThree 和 FinalProcessing。

自然,我们不控制用户提供的文件——它们需要不同数量的预处理步骤。

由于我的消息处理程序服务将位于单独的 API 中,因此出于性能原因,我不想调用它们只是为了返回“尚无法处理”或“不需要处理”。

同样,我不想在服务之间传递上传的文件。

理想情况下,我想通过评估内容并仅插入有意义的消息处理程序来动态设计文件的流程。

我说的是“倒置”管道,因为与其从 A 到 ZI,不如从 Z 开始检查我需要哪些阶段并且只插入最后一个阶段。

因此,如果上传的文件立即符合条件FinalProcessing,则流程只是一个元素。

如果文件需要离开,PreprocessingTwo那么流程将是PreprocessingTwo> PreprocessingThree>FinalProcessing

所以,我想我可以实现类似的东西,但我不确定细节。

然后在应用程序中

您能否建议,推荐一些方法或进一步阅读?

0 投票
1 回答
250 浏览

design-patterns - 责任链范围

嗨,我想知道责任链范围。

一般来说,这是一种常用的模式,它本身有处理程序,每个处理程序都将功能操作传递给它的主管。

我在示例场景中看到的是:

在这种情况下是否违反了责任链模式:

作为摘要:

第二种情况适合责任链还是违反责任链?

例如,Netty 本身有处理程序,并且都有其负责的操作,并且它们还在它们之间传递信息。我们可以说 Netty 处理程序机制适合责任链吗?

0 投票
2 回答
1549 浏览

java - 在责任链模式中由多个处理程序处理请求

我正在学习设计模式以在代码中实现它,我想我找到了一个我认为可行但有一个主要缺陷的模式。

我最终采用的模式是责任链模式。据我了解,有一个请求传递给单个处理程序,该处理程序将处理请求或将其传递到链中。

我看到的唯一问题是它指定一旦其中一个处理程序处理了请求,处理就会停止。我想要一些能够持续进行的东西,并让每个处理程序都有机会处理请求。

问题陈述

我正在创建一个应用程序,它将向公司发送发票,我想知道谁查看了发票并签字。我们需要确保每个部门都签字,如账户、财务等。重要的方面只是导致 1 个部门签署它不应该结束我认为以这种模式发生的过程

这种模式完全有可能不适合我,如果是这样,你能建议我一个适合我的模式。这不是一个课堂项目,它只是我学习使用模式并发现它在日常生活中的用途。

0 投票
2 回答
247 浏览

c++ - 如何概括调用 C++ 中的函数列表?

我有以下代码允许我实例化然后调用void()函数列表。

(如果您希望编译和运行此代码,我正在使用https://github.com/philsquared/Catch进行单元测试)。

我的问题是如何模板ChainOfResponsibility类以接受具有不同(但一致)签名的函数?

例如,考虑 aChainOfResponsibility<void(int)>或 a ChainOfResponsibility<ReturnClass(Argument1Class, Argument2Class)>

为了论证,假设第二个示例返回链中最后一个成员返回的值,或者如果链为空,则返回 ReturnClass 的默认值。

此外,如果 STL 已经包含实现此目的的模板类,那么我更愿意使用它而不是我自己开发的类。