在运行时动态选择类

zig*_*ggy 1 java class-design classloader java-ee

我试图想出一个解决方案,根据消息类型,在运行时选择处理"消息"的类.我知道我可以使用这样的东西

if msg_type = "A"
  MsgAProcessor.execute(message);
else if msg_type = "B"
  MsgBProcessoror = execute(message);
....
....
....
Run Code Online (Sandbox Code Playgroud)

我不想使用上面的方法,因为我不希望代码知道我可以处理的消息类型的任何信息.我希望将来能够为新的消息类型添加新的消息处理器.我现在想到的解决方案如下

目前有3个消息处理器

MsgAProcessor
MsgBProcessor
MsgBProcessor
Run Code Online (Sandbox Code Playgroud)

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

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

MsgProcessor proc = new MsgAprocessor()proc.execute()

上面将要求在if语句中,因为它需要在找到消息类型后立即调用.我还想避免使用实现类类型进行实例化.

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

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

Sur*_*ran 5

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

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

  • 一个小但有用的增强功能:在Processor接口中添加canExecute(String message)方法.在ProcessorControl中维护处理器的列表(而不是映射).当消息到来时,然后遍历处理器并在每个处理器上调用canExecute.返回true的那个是正确的.这样做的好处是,检查消息类型的代码现在位于处理器中,只要注册部分是数据驱动的(例如,使用属性文件),就可以在没有任何代码更改的情况下添加新处理器. (3认同)