gpt4 book ai didi

java - 如何避免使用instanceof/这里如何使用多态

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:11 25 4
gpt4 key购买 nike

我正在开发我的第一个网络应用程序,我发现了一些我不确定如何解决的问题。我有以下 paquets 层次结构

interface Packet {}
class NewClientPacket implements Packet {}
class DisconnectPacket implements Packet {}
class DataPacket implements Packet {}
...

现在,服务器需要处理任何可能由客户端发送的数据包,并对每个数据包做不同的事情。我要写的第一件事是:

Packet packet = (Packet) myStream.readObject();
if (packet instanceof NewClientPacket) {
...
} else if (packet instanceof DisconnectPacket {
...
} else if (packet instanceof DataPacket) {
...
}
...

但我一点也不喜欢这个(它使用 instanceof,在添加大量新的 Packet 子类时扩展性很差,而且它非常冗长...)

我发现通常当我必须使用 instanceof 时,我可以通过使用多态来避免它,所以我考虑将 Packet 接口(interface)更改为

interface Packet {
void handle(PacketHandler handler);
}

然后我就可以做

Packet packet = (Packet) myStream.readObject();
packet.handle(this);

但我不知道这是否是解决问题的好方法。你能推荐其他人,或评论我的吗?

最佳答案

在这个上下文中,唯一应该知道其实际类型的对象是 Packet 实例。因此,您将编写一个 Handler,将其提供给 Packet 并从那里发送。这看起来像下面这样:

interface Handler {
void handle(NewClientPacket packet);
void handle(DisconnectPacket packet);
void handle(DataPacket packet);
}

interface Packet {
void dispatch(Handler handler)
}

class NewClientPacket implements Packet {
@Override
public void dispatch(Handler handler) {
handler.handle(this);
}
}

class DisconnectPacket implements Packet {
@Override
public void dispatch(Handler handler) {
handler.handle(this);
}
}

class DataPacket implements Packet {
@Override
public void dispatch(Handler handler) {
handler.handle(this);
}
}

所有实现都将根据其类型调用正确的handle 方法。这种方法被命名为 Visitor Pattern .实际上,您应该为这些方法选择不太通用的名称,以使您的代码更具可读性。通常会使用特定于域的名称。

关于java - 如何避免使用instanceof/这里如何使用多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23468261/

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