在java对象之间实现通信的正确方法是什么?

时间:2010-03-19 12:17:37

标签: java design-patterns oop static-members

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  

我出现的问题是,这8个类中的大多数,我认为是逻辑紧密耦合的,每个类必须具有该包中每个其他类的工作知识,以便能够从它需要时。

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

  

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

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

这些类是否具有状态?或者只是一组可能是静态的方法?

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

答案 2 :(得分:0)

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