【问题标题】:Why would Chain of Responsibility be inappropriate when there is only one handler for each request?当每个请求只有一个处理程序时,为什么责任链不合适?
【发布时间】:2017-01-24 19:59:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: design-patterns usb chain-of-responsibility


    【解决方案1】:

    我认为您引用的警告措辞不当,可能会引起一些混乱。我想作者的意思是:

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

    另一种说法是,责任链模式引入了一些复杂性,只有当您实际上有多个处理程序并且客户端对象不容易知道要使用哪个处理程序时,才应该使用这种复杂性。如果您知道只有一个处理程序,则不需要链或指针,因为您确切知道将请求传递给哪个对象。如果您有多个处理程序,但很容易查看请求并使用简单的“if”语句判断哪个对象将处理它,那么您也不需要链或指针。

    旁白:作为在多个平台上实现 USB 固件的人,我认为您不需要像责任链这样正式的东西。我也认为你甚至不需要指针。您可以使用简单的 if 语句和从 USB 堆栈到用户代码的硬编码回调,以便将每个传入的控制传输定向到可以处理它的适当代码。

    【讨论】:

    • 啊,是的,这是有道理的。 @DavidGrayson,“您可以使用简单的 if 语句和从 USB 堆栈到用户代码的硬编码回调,以便将每个传入的控制传输定向到可以处理它的适当代码。”你能详细说明你的意思吗?
    • 您可以查看this USB stack 并了解当新的控制传输开始时,它会根据控制传输中的值调用 usbStandardDeviceRequestHandler 或 usbCallbackSetupHandler。后一个函数必须在任何使用 USB 堆栈的应用程序中定义。
    • 感谢您的链接!我从我们正在使用的平台的制造商那里看到了类似的例子。但是,我的要求需要处理请求的方式/时间的运行时灵活性。这是我选择 CoR 的原因之一。再次感谢您的意见!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多