0

我的场景是这样的:

当您按消息类型将消息发送到不同的目的地时,我有一个消息传递系统。

这是我目前的设计:

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但我不确定它是否有意义。

谢谢,雷,

4

2 回答 2

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

于 2013-04-18T12:23:07.330 回答
0

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

你不能,它是抽象的。


由于 MessageKind3 用于记录,因此它的结构是已知的。因此对于 MessageKind3 项目创建一个特殊的 LogItem 类,它将被实例化为:

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

并将这些项目附加到 MessageKind3。

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

于 2013-04-18T12:23:08.543 回答