gpt4 book ai didi

java - 如何为接口(interface)实现找到/调用适当的处理程序?

转载 作者:行者123 更新时间:2023-11-30 10:56:01 25 4
gpt4 key购买 nike

假设有一个接口(interface)有几个实现:

//methods and implementations are omitted
public interface MyRequest {}

并且从这个接口(interface)扩展了几个处理程序:

public <T extends MyRequest> inteface Handler<> {
MyResult handle(T request)
}

public XmlHandler implements Handler<XmlRequest> {
@Override
MyResult handle(XmlRequest request) {
//...
}
}

public JsonHandler implements Handler<JsonRequest> {
@Override
MyResult handle(JsonRequest request) {
//...
}
}

至此很清楚,但问题是,当从解析器解析请求时只返回接口(interface):

public void  someMethod () {
XmlHandler xmlHandler = ...
JsonHandler jsonHandler = ...
MyParser parser = ...
MyRequest request = parser.parse(someObejct);

if (request instanceof JsonRequest) {
jsonHandler.handle(request);
}

if (request instanceof XmlRequest) {
xmlHandler.handle(request);
}

}

instanceof 在这里非常糟糕。我该如何避免这种情况?

我最初的想法是在这里使用访问者模式,例如将处理程序放入 visito 并为调用 handler.handle 方法的每种请求类型定义十几种方法。问题当然在于 dozen 这个词。

是否有更优雅的方式来“选择”请求调用的处理程序(或比访问者更优雅的模式)?

P.S.顺便问一下,访客模式适合这里吗?

最佳答案

是的,Visitor Pattern是解决这个问题的好方法。

public interface MyRequestVisitor {
public void handle(JsonRequest request);
public void handle(XmlRequest request);
}

public interface MyRequest {
public void handle(MyRequestVisitor visitor);
}

public class JsonRequest implements MyRequest {
public void handle(MyRequestVisitor visitor) {
visitor.handle(this); // calls first handle method
}
}

public class JsonRequest implements MyRequest {
public void handle(MyRequestVisitor visitor) {
visitor.handle(this); // calls second handle method
}
}

然后,在 someMethod 中:

public void  someMethod () {
XmlHandler xmlHandler = ...
JsonHandler jsonHandler = ...
MyParser parser = ...
MyRequest request = parser.parse(someObejct);
request.handle(new MyRequestVisitor() {
public void handle(JsonRequest request) {
jsonHandler.handle(request);
}
public void handle(XmlRequest request) {
xmlHandler.handle(request);
}
});

如果您添加一个名为 NewRequest 的新子类,编译器会强制您实现 NewRequest.handle(MyRequestVisitor),这会强制您添加一个新的 MyRequestVisitor。 handle(NewRequest request) 方法,这会强制您也将其添加到匿名类中。

你不能不实现它,所以你是安全的,而多路 if-instanceof 则不是。

关于java - 如何为接口(interface)实现找到/调用适当的处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33139626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com