针对消息传递对象设计的OOP建议

时间:2013-04-18 12:12:41

标签: java oop design-patterns architecture

我的情况是这样的:

当您通过消息类型将消息分派到不同的目的地时,我有一个消息传递系统。

这是我目前的设计:

Abstract class: MessageKindAbs

MessageKind1 extends MessageKindAbs  
MessageKind2 extends MessageKindAbs
MessageKind3 extends MessageKindAbs

依旧......

现在MessageKind3是一种特殊的类型。它的目的是将MessageKind1MessageKind2的内容发送到日志进程。

所以我在MessageKind3内创建了MessageKind3Items

的列表
list<MessageKind3Item> MessageKind3ItemList...

MessageKind3Item包含用于记录目的的MessageKind1 / MessageKind2信息。

所以基本上会发生的事情是每个MessageKind3Item还包含MessageKindAbs类型。

但这对我没有意义。

例如:向数据库队列发送消息并记录MessageKind1持有且MessageKind2成立的信息。

所以我的OOP设计有点复杂。

任何人都可以帮我找到我的方式吗?

我本可以在MessageKind3Item内创建另一个MessageKindAbs实例类型,但我不确定它是否有意义。

感谢, 射线,

2 个答案:

答案 0 :(得分:3)

让所有可以发送到日志进程的消息实现一个接口。例如:

public interface Logable {

    void logTo(PrintWriter write);
}

MessageKind3只需要维护Logable列表。请注意,使用PrintWriter只是一个建议。您可能需要更复杂的参数类型,以便在界面实现中更容易记录。

MessageKind3将如下所示:

public class MessageKind3 extends MessageKindAbs {

    private List<Logable> logables;

    //...

    public List<Logable> getLogables() {
        return Collections.unmodifiableList(logables);
    }
}

logables将包含MessageKind1MessageKind2的实例,因为它们实现了Logable

答案 1 :(得分:0)

  

我本可以在MessageKind3Item里面创建另一个实例类型   MessageKindAbs但我不确定它是否有意义。

你不能,这是抽象的。


由于MessageKind3用于记录,因此其结构已知。 因此,对于MessageKind3项,创建一个特殊的LogItem类,该类将使用以下内容进行实例化:

LogItem createLogItem(MessageKind1) {  return new LogItem(); }
LogItem createLogItem(MessageKind2) {  return new LogItem(); }

并将这些项目附加到MessageKind3。

你试图将所有类与继承紧密结合,这就是问题所在。