【问题标题】:What is the right way to implement communication between java objects?实现java对象之间通信的正确方法是什么?
【发布时间】:2010-03-19 12:17:36
【问题描述】:

我正在从事一个学术项目,该项目在 java 中模拟一个相当大的排队过程。模拟器的核心位于一个包中,其中存在 8 个类,每个类都实现一个概念。项目中的每个类都遵循 SRP。这些类封装了模拟器的行为,并将项目中的所有其他类相互连接。

出现的问题是,这 8 个类中的大多数按照我认为的逻辑是紧密耦合的,并且每个类都必须具备此包中所有其他类的工作知识,以便能够从中调用方法需要的时候。应用程序只需要每个类的一个实例,因此最好为新类中的每个类创建静态字段并使用它来进行调用 - 而不是在每个类中为包中的每个其他类保留一个引用(我'确定这是不正确的)-,但这被认为是正确的设计解决方案吗?或者是否有更适合我需求的设计模式?

【问题讨论】:

    标签: java design-patterns oop static-members


    【解决方案1】:

    听起来你有一种复杂的状态机。您可以将对象之间的方法调用抽象为异步事件。每个对象都可以将通用事件发送到“路由器”对象,而不是直接调用其他对象的方法。路由器对象会将事件转发给在路由器上注册其侦听器的任意数量的对象。您可以在侦听器或路由器算法中实现过滤器,以限制谁接收事件。状态更改也将作为事件发布。
    如果您使用 JMS 服务器作为“路由器”,您甚至可以将对象分布在多个主机上。
    这种方法以通用事件模式/接口的形式在对象之间提供了一个简单、可重用的接口。

    【讨论】:

      【解决方案2】:

      您是否考虑过使用接口来解耦类?您有 8 个类,但您可能只需要几个接口即可实现相互之间的通信/互操作性并获得很大的灵活性。

      【讨论】:

        【解决方案3】:

        我遇到的问题是,这 8 个类中的大多数按照我认为的逻辑是紧密耦合的,并且每个类都必须具备此包中所有其他类的工作知识,以便能够从需要时使用。

        没关系。 Java 组件的最小实现单元(单个类之外)是包。包中的类可以紧密耦合。只需确保耦合不会泄漏到外部(例如使用受包保护的类)。

        应用程序只需要每个类的一个实例,因此最好为新类中的每个类创建静态字段并使用它来进行调用 - 而不是在每个类中为包中的每个其他类保留一个引用(我确定这是不正确的)

        如果这八个类中的每一个都需要拥有所有其他七个类的实例,那么跨类拆分功能的方式可能并不好。如果每个班级只有一个职责范围,为什么会出现这种严重的交叉依赖?

        这些类有状态吗?还是仅仅是静态方法的集合?

        但同样,只要这个包的公共界面看起来还不错,我就不会太担心。客户端代码是否也需要了解这八个类?

        【讨论】:

        • 这些类封装了状态完整的对象并在它们上提供了修改器。仅仅因为这个项目是一个模拟实验,所以没有客户存在。除了模拟变量的初始初始化之外,此后程序参数没有其他变化。它只是运行到完成并产生结果。这 8 个类代表具有离散职责的对象,这些对象必须协同工作以产生类似于用 C 编写的串行程序中的主例程的东西,以便模拟运行。
        猜你喜欢
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 2012-06-30
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 2018-08-12
        相关资源
        最近更新 更多