当每个请求只有一个处理程序时,为什么责任链不合适?
Why would Chain of Responsibility be inappropriate when there is only one handler for each request?
我目前正在为一个项目开发 USB 固件。在弄清楚如何最好地处理来自主机的服务请求时,我决定实施责任链模式。
在我的应用程序中,从主机检索到的每个请求总是只有一个处理程序。所以基本上我提前设置了我的处理程序链,循环从等待来自主机的请求开始。请求被传递给 "root" 处理程序,处理程序通过检查请求的一部分来决定是处理它还是将它传递到链中。处理完请求后,我们返回等待来自主机的另一个请求。
同样,只有一个处理程序会处理一个请求。请求未被处理,即遍历整个处理程序链,是一种错误情况。
阅读 www.sourcemaking.com 中的责任链模式后,这句话引起了我的注意(讨论部分的最后一段):
Do not use Chain of Responsibility when each request is only handled by one handler, or, when the client object knows which service object should handle the request.
这有什么实际原因吗?在我看来,在作者警告反对的情况下使用责任链是完全有效的。谁能告诉我为什么这是一个糟糕的设计选择?
我认为您引用的警告措辞不当,可能会造成一些混乱。我认为作者的意思是:
Do not use Chain of Responsibility when all the requests will be handled by just one handler, or when the client object knows which service object should handle the request.
另一种说法是,责任链模式引入了一些复杂性,如果您实际上有多个处理程序,并且客户端对象不容易知道使用哪个处理程序,那么您应该只使用这种复杂性.如果您知道只有一个处理程序,则不需要链或指针,因为您确切地知道要将请求传递给哪个对象。如果您有多个处理程序,但很容易查看请求并使用简单的 "if" 语句告诉哪个对象将处理它,那么您同样不需要链或指针。
旁白:作为在多个平台上实现了 USB 固件的人,我认为您不需要像责任链这样正式的东西。我也认为你甚至不需要指针。您可以使用简单的 if 语句和 hard-coded 从 USB 堆栈到用户代码的回调,以便将每个传入的控制传输定向到可以处理它的适当代码。
我目前正在为一个项目开发 USB 固件。在弄清楚如何最好地处理来自主机的服务请求时,我决定实施责任链模式。
在我的应用程序中,从主机检索到的每个请求总是只有一个处理程序。所以基本上我提前设置了我的处理程序链,循环从等待来自主机的请求开始。请求被传递给 "root" 处理程序,处理程序通过检查请求的一部分来决定是处理它还是将它传递到链中。处理完请求后,我们返回等待来自主机的另一个请求。
同样,只有一个处理程序会处理一个请求。请求未被处理,即遍历整个处理程序链,是一种错误情况。
阅读 www.sourcemaking.com 中的责任链模式后,这句话引起了我的注意(讨论部分的最后一段):
Do not use Chain of Responsibility when each request is only handled by one handler, or, when the client object knows which service object should handle the request.
这有什么实际原因吗?在我看来,在作者警告反对的情况下使用责任链是完全有效的。谁能告诉我为什么这是一个糟糕的设计选择?
我认为您引用的警告措辞不当,可能会造成一些混乱。我认为作者的意思是:
Do not use Chain of Responsibility when all the requests will be handled by just one handler, or when the client object knows which service object should handle the request.
另一种说法是,责任链模式引入了一些复杂性,如果您实际上有多个处理程序,并且客户端对象不容易知道使用哪个处理程序,那么您应该只使用这种复杂性.如果您知道只有一个处理程序,则不需要链或指针,因为您确切地知道要将请求传递给哪个对象。如果您有多个处理程序,但很容易查看请求并使用简单的 "if" 语句告诉哪个对象将处理它,那么您同样不需要链或指针。
旁白:作为在多个平台上实现了 USB 固件的人,我认为您不需要像责任链这样正式的东西。我也认为你甚至不需要指针。您可以使用简单的 if 语句和 hard-coded 从 USB 堆栈到用户代码的回调,以便将每个传入的控制传输定向到可以处理它的适当代码。