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