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

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

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

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

谁能想到一种无需使用if-else检查标记字符串而最好使用MessagePack子类来完成我想要的任务的方法吗?

最佳答案

一个(其他)选择是让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类,在添加模块或消息包类型时无需调整
一个Messenger上所有消息的一个入口点
一个模块只能包含其可以处理的消息包类型的逻辑/知识。因此,在添加新的消息包时,您只需要调整将处理此消息的模块即可。


不确定这是否是带有官方名称的官方设计模式,但是这就是我的处理方式

08-05 16:53