我正在制作网络应用程序。这是问题所在:
我有一个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上所有消息的一个入口点
一个模块只能包含其可以处理的消息包类型的逻辑/知识。因此,在添加新的消息包时,您只需要调整将处理此消息的模块即可。
不确定这是否是带有官方名称的官方设计模式,但是这就是我的处理方式