【问题标题】:OOP advice for messaging objects design消息传递对象设计的 OOP 建议
【发布时间】:2013-04-18 21:58:07
【问题描述】:

我的场景是这样的:

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

这是我目前的设计:

Abstract class: MessageKindAbs

MessageKind1 extends MessageKindAbs  
MessageKind2 extends MessageKindAbs
MessageKind3 extends MessageKindAbs

等等..

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

所以我在MessageKind3 内部创建了MessageKind3Items 的列表:

list<MessageKind3Item> MessageKind3ItemList...

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

所以基本上发生的情况是每个MessageKind3Item 还包括MessageKindAbs 类型。

但这对我来说毫无意义。

例如:向DB队列发送消息,记录MessageKind1持有和MessageKind2持有的信息。

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

谁能帮我找到这里的路?

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

谢谢, 雷,

【问题讨论】:

    标签: java oop design-patterns architecture


    【解决方案1】:

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

    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

    【讨论】:

    • 那么 MessageKind3 将如何在其中包含 MessageKind1 和 MessageKind2 的信息?
    • 所以如果我有更多的操作,比如“email-ables”或“monitor-ables”,我会复制所有列表吗?
    • @rayman 我认为您的建议方向有点错误,因为那样您将在MessageKind3 中汇总多个职责。也许对于这种情况,您应该看看适配器模式 - en.wikipedia.org/wiki/Adapter_pattern
    • 我喜欢这个答案。但再澄清一点。为什么我需要 logTo?我的意思是,一旦消息到达目的地,它就已经知道它应该在哪里标识。 “使接口实现中的日志记录更容易。” - 你能详细说明一下吗?谢谢!
    【解决方案2】:

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

    你不能,这是抽象的。


    因为 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 的信息
    • 我想我现在明白了:) 所以如果我有更多的事情要做,比如监控,我还应该创建新的 MonitorItems 列表吗?
    • 你认为我应该创建一些抽象的 Item 继承所有“操作项”吗?(LogItem 扩展 ItemAbs,MonitoringItem 扩展 ItemAbs...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多