在阅读了一篇有趣的文章之后,我有几个问题.请参阅Common Pitfall#8:在 [zero-turn-around]上假装Java更像是C(即不理解OOP) 我同意作者对陷阱的解决方案.我的代码遇到了类似的问题(滥用了inst
我同意作者对陷阱的解决方案.我的代码遇到了类似的问题(滥用了instanceof).但我无法按照作者的建议实现代码.我的方案如下
>我将JMS作为消息传递总线.
>消息在系统中浮动.监听器通常会收听消息.
>所有消息都有一个父IMessage.
>我使用instanceof来区分消息.
>侦听器通常执行特定于域的业务逻辑.
如果我同意作者的解决方案,我将不得不在Message类中实现特定于域的业务逻辑,我认为这将使我的轻量级消息对象膨胀.不仅如此,我现在在我的消息对象中有许多引用(组合),我认为这是不公平的,因为消息对象现在将具有业务(域)行为.
这个问题的合理解决方案是什么?示例代码如下
public void onMessage(IMessage mssg) { if(mssg instanceof MoPn){ ... } else if(mssg instance of MoZn){ ... } else if(mssg instance of MoLn){ ... } }一个合理的解决方案是创建知道使用特定类型的消息的侦听器.
这是界面.
interface MessageListener<M extends IMessage> { void onMessage(M message); }
这是其中一个类的骨架:
class MoZnListener implements MessageListener<MoZn> { public void onMessage(MoZn message) { } }
现在,您可以在消息和侦听器之间创建映射.您可以使用属性文件,硬编码地图,注释.它是由你决定.一旦拥有它,您就可以实现一个看起来像的JMS消息监听器
class MessageEntryPoint implements MessageListener { public void onMessage(Message message) { getMessageHandler(message).onMessage(message.getObject()); } }
现在你的系统是可以接受的.没有实例.要引入新的消息类型,您只需创建适当的类来实现支持它的IMessage和侦听器.
BTW更多评论.
>使用I作为标记界面不是java风格.>我不熟悉您的域名,可能MoPn的名称可以自我解释,但恕我直言,它不是.尝试使用更多可自我解释的标识符.