Java 面向对象的消息对象设计建议

Java 面向对象的消息对象设计建议,java,oop,design-patterns,architecture,Java,Oop,Design Patterns,Architecture,我的场景是这样的: public class MessageKind3 extends MessageKindAbs { private List<Logable> logables; //... public List<Logable> getLogables() { return Collections.unmodifiableList(logables); } } 当您按消息类型将消息发送到不同的目的地时,我有

我的场景是这样的:

public class MessageKind3 extends MessageKindAbs {

    private List<Logable> logables;

    //...

    public List<Logable> getLogables() {
        return Collections.unmodifiableList(logables);
    }
}
当您按消息类型将消息发送到不同的目的地时,我有一个消息系统

这就是我目前的设计:

Abstract class: MessageKindAbs

MessageKind1 extends MessageKindAbs  
MessageKind2 extends MessageKindAbs
MessageKind3 extends MessageKindAbs
等等

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

因此,我在
MessageKind3
中创建了一个
MessageKind3项目的列表

list<MessageKind3Item> MessageKind3ItemList...
list MessageKind3ItemList。。。
messagekind3项目
包括用于记录的
MessageKind1
/
MessageKind2
信息

因此,基本上,每个
messagekind3项目也包括
MessageKindAbs
类型

但这对我来说毫无意义

例如:向DB队列发送消息,并记录
MessageKind1
保存的信息和
MessageKind2
保存的信息

所以我的OOP设计有点复杂

有人能帮我找到这里吗

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

谢谢,
ray,

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

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);
    }
}
公共类MessageKind3扩展了MessageKindAbs{
私有列表日志;
//...
公共列表getLogables(){
返回集合。不可修改列表(可记录);
}
}

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

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

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);
    }
}
公共类MessageKind3扩展了MessageKindAbs{
私有列表日志;
//...
公共列表getLogables(){
返回集合。不可修改列表(可记录);
}
}
logables
将包含
MessageKind1
MessageKind2
的实例,因为它们实现了
Logable

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

你不能,这是抽象的


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

LogItem createLogItem(MessageKind1) {  return new LogItem(); }
LogItem createLogItem(MessageKind2) {  return new LogItem(); }
并将这些项目附加到MessageKind3

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

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

你不能,这是抽象的


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

LogItem createLogItem(MessageKind1) {  return new LogItem(); }
LogItem createLogItem(MessageKind2) {  return new LogItem(); }
并将这些项目附加到MessageKind3


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

我的意思是引用类型而不是实例。2.我试图使用OOP来最小化紧耦合。对不起,我不知道你的意思。我的建议是加入一个日志项,而不是不同类的实例-这将减少组件耦合以及它们之间的相互了解。MessageKind3假设要做更多的事情,而不仅仅是日志记录。MessageKind1/MessageKind2的日志记录只是一个例子。例如,它可以将这些消息发送到电子邮件服务。。我只是举个例子。问题是,每个MessageKind对象应该被发送到不同的目的地,而MessageKind3保存着MessageKind1和MessageKind2的信息,我想我现在明白了:)所以如果我有更多的事情要做,比如监控,我也应该创建一个新的监控项列表?你认为我应该创建一个包含所有信息的抽象项吗“从it继承操作项?(LogItem扩展ItemAbs,MonitoringItem扩展ItemAbs…)我的意思是引用类型而不是实例。2.我试图使用OOP来最小化紧耦合。对不起,我不知道你的意思。我的建议是加入一个日志项,而不是不同类的实例-这将减少组件耦合以及它们之间的相互了解。MessageKind3假设要做更多的事情,而不仅仅是日志记录。MessageKind1/MessageKind2的日志记录只是一个例子。例如,它可以将这些消息发送到电子邮件服务。。我只是举个例子。问题是,每个MessageKind对象应该被发送到不同的目的地,而MessageKind3保存着MessageKind1和MessageKind2的信息,我想我现在明白了:)所以如果我有更多的事情要做,比如监控,我也应该创建一个新的监控项列表?你认为我应该创建一个包含所有信息的抽象项吗“从it继承操作项?(LogItem扩展ItemAbs,MonitoringItem扩展ItemAbs…)那么MessageKind3将如何在其中包含MessageKind1和MessageKind2的信息?因此,如果我有更多的操作,如“email-ables”或“monitor-ables”,我将复制所有列表?@rayman我认为你的建议有点方向错误,因为这样你就可以聚合多个r