当前位置 : 主页 > 手机开发 > 其它 >

在面向对象的Java中使用反模式

来源:互联网 收集:自由互联 发布时间:2021-06-19
在阅读了一篇有趣的文章之后,我有几个问题.请参阅Common Pitfall#8:在 [zero-turn-around]上假装Java更像是C(即不理解OOP) 我同意作者对陷阱的解决方案.我的代码遇到了类似的问题(滥用了inst
在阅读了一篇有趣的文章之后,我有几个问题.请参阅Common Pitfall#8:在 [zero-turn-around]上假装Java更像是C(即不理解OOP)

我同意作者对陷阱的解决方案.我的代码遇到了类似的问题(滥用了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的名称可以自我解释,但恕我直言,它不是.尝试使用更多可自我解释的标识符.

网友评论