如何使用多态替换if-else块

时间:2011-12-09 19:58:11

标签: java

我正在制作网络应用程序。这是问题所在:

我有一个Messenger课程。 Messenger有几个名为ModuleA,B,C等的模块类。 信使发送MessagePacks(给其他信使)。每个MessagePack都有一个模块目的地意味着一旦它到达Messenger,它就被转发到正确的模块(A,B,C等)。

目前为了转发到正确的模块,我正在使用if-else检查MessagePack上的标签来决定转发的位置。

我想要做的是使用MessagePack子类而不是使用标签(标签是字符串)。所以TypeAMessage转到ModuleA等。我能想到的唯一方法就是在MessagePack中调用Messenger实例并调用像这样的方法:Messenger.fowardToModuleA(this);但是在MessagePack上有一个Messenger实例是没有意义的(并且可能会导致问题)。

有没有人能想到一种方法来完成我想要的任务而不使用if-else检查标记字符串,最好使用MessagePack子类?

1 个答案:

答案 0 :(得分:3)

(其他)选项是让Module决定他们接受哪个MessagePack哪个不接受。因此,您的Messenger仍然会包含/链接到多个Module类,但只需将每个传入的MessagePack转发给所有Modules

for ( Module module : modules ){
  if ( module.canHandle( messagePack ) ){
     module.handle( messagePack );
     //if messagePacks should only be handled by one module, break
  }
}

这些模块是否在messagepack上使用String标识符,或者只接受messagepack接口的某些特定实现由您决定。你有这种方法

  • 一个Messenger类,在添加模块或消息包类型时不需要调整
  • 信使上所有邮件的一个入口点
  • 模块应该只包含它可以处理的消息包类型的逻辑/知识。因此,在添加新的messagepack时,您只需要调整将处理此问题的模块。

不确定这是否是具有官方名称的官方设计模式,但这就是我将如何处理这个