分离逻辑与多态之间的冲突

rev*_*nce 6 java oop design-patterns

我正在尝试用Java创建一个消息传递系统.我有一个接口消息,它将有多个实现(例如TextMessageAudioMessage).该接口将在服务器和客户端上都可用.

我的问题是客户端应根据从服务器收到的消息类型呈现不同的可视输出.因此,我要么必须知道我正在处理的消息的类型,我可以使用instanceof(),或者我可以在Message接口中放置一个抽象方法并使用多态,因此Message负责创建视觉输出.

然而,做任何这些都感觉很脏,因为我不得不每次创建一个新的if instanceof块或让Message负责创建视觉部分,这感觉就像错误一样,因为它应该是某种模型.

有没有人有我可以在这里使用的解决方案或适当的设计模式?

谢谢!

Nar*_*hai 7

您可以使用访客模式.

interface Message{
     public void accept(MessageVisitor visitor);
}

interface MessageVisitor{
    public void visit(TextMessage message);
    public void visit(AudioMessage message);
}

class PrintVisitor implements MessageVisitor{
    public void visit(TextMessage message){
         //print text message
    }

    public void visit(AudioMessage message){
        //do step required
    }
}

class TextMessage implements Message{
     //other methods

     public void accept(MessageVisitor visitor){
          visitor.visit(this);
     }
}
Run Code Online (Sandbox Code Playgroud)

使用这种双重调度技术,您instanceof不需要进行检查.除了打印逻辑在PrintVisitor课堂上出现之外,它还具有更大的灵活性.

visitor.visit(this);在这一行,你呼吁visitvisitorthis,现在this会用实际类型实例,因此该方法visitor将被称为将根据实际类型是.

你如何实现灵活性?

因为现在您可以在Message不更改Message使用Visitors 的实际代码的情况下向类中添加新操作

要小心一些垮台.当您的Message更改层次结构将导致所有Visitors的更改.所以要照顾好这一点.