gpt4 book ai didi

java - 在面向对象的 Java 中使用反模式

转载 作者:搜寻专家 更新时间:2023-11-01 02:08:08 25 4
gpt4 key购买 nike

在阅读了一篇有趣的文章后,我对此有一些疑问。请参阅 [zero-turn-around] 上的常见陷阱 #8:假装 Java 更像 C(即不理解 OOP)

我同意作者对陷阱的解决方案。我的代码面临类似的问题(滥用 instanceof)。但是我无法按照作者建议的那样执行代码。我的场景如下

  1. 我将 JMS 作为消息传递总线。
  2. 消息在系统中 float 。 Listener 通常会收听消息。
  3. 所有消息都有一个父 IMessage。
  4. 我使用 instanceof 来区分消息。
  5. 监听器通常执行领域特定的业务逻辑。

如果我同意作者的解决方案,我将不得不在消息类中实现领域特定的业务逻辑,我认为这会使我的轻量级消息对象膨胀。不仅如此,我现在将在我的消息对象中有许多引用(组合),我认为这是不公平的,因为消息对象现在将在其中具有业务(域)行为。

这个问题的合理解决方案是什么?下面的示例代码

public void onMessage(IMessage mssg)
{

if(mssg instanceof MoPn){
...
} else if(mssg instance of MoZn){
...
} else if(mssg instance of MoLn){
...
}
}

最佳答案

一个合理的解决方案是创建知道处理特定类型消息的监听器。

这是界面。

interface MessageListener<M extends IMessage> {
void onMessage(M message);
}

这是其中一个类的框架:

class MoZnListener implements MessageListener<MoZn> {
public void onMessage(MoZn message) {
}
}

现在您可以在消息和监听器之间创建映射。您可以使用属性文件、硬编码 map 、注释。它是由你决定。一旦你有了它,你就可以实现一个 JMS 消息监听器,看起来像

class MessageEntryPoint implements MessageListener {
public void onMessage(Message message) {
getMessageHandler(message).onMessage(message.getObject());
}
}

现在您的系统是可扩展的。没有实例。要引入新的消息类型,您只需创建适当的类来实现 IMessage 和支持它的监听器。

顺便说一句,更多评论。

  1. 使用I 来标记接口(interface)不是java 风格的。
  2. 我不熟悉您的域名,MoPn 这样的名称对您来说可能是不言自明的,但恕我直言,事实并非如此。尝试使用更多 self 解释的标识符。

关于java - 在面向对象的 Java 中使用反模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25960885/

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