0

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

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

4

3 回答 3

1

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

于 2010-03-19T15:57:00.967 回答
0

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

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

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

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

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

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

于 2010-03-19T12:23:59.887 回答
0

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

于 2010-03-19T12:28:01.607 回答