gpt4 book ai didi

java - 如何删除instanceof以调用正确的方法?

转载 作者:行者123 更新时间:2023-12-02 08:45:31 25 4
gpt4 key购买 nike

我有以下类层次结构:

public interface Message
public interface V2Message extends Message
public interface V3Message extends Message

我定义了另一个接口(interface)来验证消息。

public interface Validation {
boolean validate(Message message);
}

每个实现 Validation 的类都可以处理 V2 和/或 V3 消息,因此在我的实现中,我必须区分我想要验证的消息类型,因为代码会有所不同。

public class MyValidation implements Validation {
public boolean validate(Message message) {
if(message instanceof V2Message) {
return validateV2((V2Message)message);
} else if (message instanceof V3Message) {
return validateV3((V3Message)message);
}
}

我想知道是否有办法删除 instanceof 的使用。

最佳答案

一种方法是实现 Visitor pattern 。定义MessageVisitor接口(interface):

public interface MessageVisitor {
boolean visit(V2Message message);
boolean visit(V3Message message);
}

然后重新定义 Message 接口(interface)以包含一个方法:

public void visitMessage(MessageVisitor visitor);

Message 的每个具体类都会实现如下所示的 visitMessage 方法:

public void visitMessage(MessageVisitor visitor) {
visitor.visit(this);
}

由于这是在每个具体子类中定义的,因此编译器将调用正确版本的visit

如果您只需要验证,这可能有点过分了。但是,如果您要实现需要以不同方式处理不同类型消息的其他操作,那么它的优点是您可以在根本不更改消息类的情况下实现每个操作。本文开头的文章链接描述了其优点和缺点。

关于java - 如何删除instanceof以调用正确的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7984310/

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