java 责任链特殊场景

kjthegm6  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(124)

在一般的责任链设计模式实现中,请求的处理程序会按顺序添加到链中,并相应地执行。但是在特殊情况下,如果需要跳过中间处理程序并在最终处理程序中处理请求,是否会违反COR设计模式?请参考下面的代码片段。希望它能进一步澄清这一点。提前感谢。

public class SomeHandler extends RequestProcessor {

public SomeHandler() {
    super();
}

@Override
public void process(Request request) {
    if (request != null) {
        //Logic to decide request type
        if ("TYPE_ONE".equalsIgnoreCase(request.getType())) {
            //passing to next object in the chain. Multiple chains...
            this.nextRequestProcessor.process(request);
        } else if ("TYPE_TWO".equalsIgnoreCase(request.getType())) {
            //passing to the last object in the chain,skip all the other intermediate objects
            new FinalHandler().process(request);
        }
    }
}

}

x4shl7ld

x4shl7ld1#

这有点主观。
这个处理程序知道某种类型的请求必须由某个处理程序1处理。因此,它绕过链并直接调用处理程序。这意味着这个处理程序知道链中的其他(具体)处理程序(知识泄漏)。
注意:您可以在SomeHandler中引用最终的处理程序示例,而不是创建处理程序的新示例。
或者,您可以在调用链之前做出此决定。

public class Client {
    private RequestProcessor chainOfRequestProcessors;
    private RequestProcessor finalHandler; //instance of FinalHandler

    public void process(Request request) {
        if ("TYPE_TWO".equalsIgnoreCase(request.getType())) {
            finalHandler.process(request);
        } else {
            //handle normally
            chainOfRequestProcessors.process(request);
        }
    }
}

设计模式就是这样。一个解决特定类型问题的解决方案的模式或框架模板。这并不意味着你不能根据你的用例或需要(假设你知道你在做什么)以不同的方式调整和使用它。
1 You've said([emphasis mine])
....但在特殊场景下,如果需要跳过中间处理器,在最终处理器中处理请求...
但是在你的例子中,委托是以一种通常的方式发生的(通过检查请求类型)。在这个例子中,如果没有中间处理程序可以处理请求类型TYPE_TWO,你可以简单地继续委托。但是我想还有更多的事情要确定,什么时候我们应该直接到最后一个处理程序,这个例子已经简化了。

相关问题