gpt4 book ai didi

java - 分离逻辑与多态性的冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:00 24 4
gpt4 key购买 nike

我正在尝试用 Java 创建一个消息传递系统。我有一个接口(interface) Message,它将有多个实现(例如 TextMessageAudioMessage)。该接口(interface)将在服务器和客户端上可用。

我的问题是客户端应该根据从服务器接收到的消息类型呈现不同的视觉输出。因此,我要么必须知道我正在处理的消息的类型,我可以使用 instanceof() 来完成,或者我可以在 Message 接口(interface)中放置一个抽象方法并利用多态性,这样 Message负责创建视觉输出。

然而,做任何这些都感觉很脏,因为我必须每次都创建一个新的 if instanceof block ,或者让 Message 负责创建视觉部分,这感觉同样错误,因为它应该是某种模型。

有没有人有我可以在这里使用的解决方案或合适的设计模式?

谢谢!

最佳答案

您可以使用 Visitor Pattern为此。

interface Message{
public void accept(MessageVisitor visitor);
}

interface MessageVisitor{
public void visit(TextMessage message);
public void visit(AudioMessage message);
}

class PrintVisitor implements MessageVisitor{
public void visit(TextMessage message){
//print text message
}

public void visit(AudioMessage message){
//do step required
}
}

class TextMessage implements Message{
//other methods

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

使用这个 double dispatch技术您的 instanceof 检查不是必需的。以及打印逻辑出现在 PrintVisitor 类中,这允许更大的灵 active 。

visitor.visit(this); 在此行中,您使用 thisvisitor 上调用 visit,现在 this 将使用实例的 actual 类型,因此将调用的 visitor 方法将根据到实际类型。

如何实现灵 active ?

因为现在您可以使用 Visitor 向您的 Message 类添加新操作,而无需更改 Message 的实际代码

也要注意一些失败。当您的 Message 层次结构发生变化时,它会导致所有 Visitor 发生变化。所以请注意这一点。

关于java - 分离逻辑与多态性的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21261077/

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