我的情况是这样的:
当您通过消息类型将消息分派到不同的目的地时,我有一个消息传递系统。
这是我目前的设计:
Abstract class: MessageKindAbs
MessageKind1 extends MessageKindAbs
MessageKind2 extends MessageKindAbs
MessageKind3 extends MessageKindAbs
依旧......
现在MessageKind3
是一种特殊的类型。它的目的是将MessageKind1
或MessageKind2
的内容发送到日志进程。
所以我在MessageKind3
内创建了MessageKind3Items
:
list<MessageKind3Item> MessageKind3ItemList...
MessageKind3Item
包含用于记录目的的MessageKind1
/ MessageKind2
信息。
所以基本上会发生的事情是每个MessageKind3Item
还包含MessageKindAbs
类型。
但这对我没有意义。
例如:向数据库队列发送消息并记录MessageKind1
持有且MessageKind2
成立的信息。
所以我的OOP设计有点复杂。
任何人都可以帮我找到我的方式吗?
我本可以在MessageKind3Item
内创建另一个MessageKindAbs
实例类型,但我不确定它是否有意义。
感谢, 射线,
答案 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
将包含MessageKind1
或MessageKind2
的实例,因为它们实现了Logable
。
答案 1 :(得分:0)
我本可以在MessageKind3Item里面创建另一个实例类型 MessageKindAbs但我不确定它是否有意义。
你不能,这是抽象的。
由于MessageKind3用于记录,因此其结构已知。 因此,对于MessageKind3项,创建一个特殊的LogItem类,该类将使用以下内容进行实例化:
LogItem createLogItem(MessageKind1) { return new LogItem(); }
LogItem createLogItem(MessageKind2) { return new LogItem(); }
并将这些项目附加到MessageKind3。
你试图将所有类与继承紧密结合,这就是问题所在。