java - 在运行时动态选择一个类

标签 java jakarta-ee class-design classloader

我正在尝试提出一个解决方案,其中根据消息类型在运行时选择处理“消息”的类。 我知道我可以使用这样的东西

if msg_type = "A"
  MsgAProcessor.execute(message);
else if msg_type = "B"
  MsgBProcessoror = execute(message);
....
....
....

我不想使用上述方法,因为我不想让代码知道我可以处理的消息类型的任何信息。我希望将来能够为新的消息类型添加一个新的消息处理器。目前想到的解决方案如下

目前有3个消息处理器

MsgAProcessor
MsgBProcessor
MsgBProcessor

这三个类都有一个名为 execute 的方法,它将以自己的方式处理消息。我创建了一个名为 MsgProcessor 的接口(interface),并在该接口(interface)中添加了 execute() 方法。

现在我很难知道调用者应该调用哪个消息处理器而无需检查消息类型。例如,我不能这样做

MsgProcessor proc = new MsgAprocessor() 过程执行()

以上仍然需要在 if 语句中,因为它需要在找出消息类型后立即调用。我还想避免使用实现类类型进行实例化。

有没有更好的方法来实现同样的目标?

我希望能够仅从接口(interface)调用 MsgProcessor.execute,并让运行时环境根据消息类型知道要调用哪个实现类。

最佳答案

  1. 有一个接口(interface) Processor,它有一个方法 execute()。您所有的三个 MsgProcessor 都实现了这一点。
  2. 有一个单独的类 ProcessorControl,它有一个 submit(String message) 方法。每当收到新消息时,您只需执行 ProcessorControl.submit(message)
  3. 现在,ProcessorControl 有一个方法 addProcessor(Proccesor proc, String type),它将处理器添加到以 type 为键的哈希表中。因此,每个处理器现在都分配有一个类型。
  4. 在submit方法中,获取hashtable.get(type).execute(proc)

这是一个简单的命令模式。

关于java - 在运行时动态选择一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5089726/

相关文章:

java - 从 JavaFX 标签中删除填充/边距

Java EE WEB-INF 安全

c++ - 编译器向空类声明添加了什么?

class-design - 代码完整中的“设计的理想特征”

java - 在启动屏幕上将 png 调整大小或缩放至指定大小

java - 在java中使用selenium包含或上传文件

java - 如何在 ActionListener 中使用不同类中的方法?

java - 如何使用Java从IE中的服务器下载xml文件?

Java EE 和应用程序服务器 - 我能做什么?

c# - 如何在类(class)内共享 IDisposable 资源?