OOP:我如何处理有相互关系的对象?

假设有两个类通过一些关系相互关联。 例如,一个Student保持列表Class ES他需要,每个Class有一个列表Student还要把它。 然后,我害怕让Student直接修改它的一组Class ,因为每个修改都必须跟着一个Class Student列表的类似修改,反之亦然。

一个解决方案是有一个类,其唯一目的是跟踪的Class - Student的关系,说Registrar 。 但是,如果Student某些方法需要知道其Class列表,则Student需要通过Registrar 。 这看起来很糟糕。 看来Student不应该访问Registrar ,它也可以访问其他Student 。 我可以想出一个解决方案,创建一个充当StudentRegistrar员之间的中介的类,向Student展示其需要知道的内容,但这看起来可能像是矫枉过正。 另一种解决方案是从Student删除任何需要访问其类的方法,并将其放在Registrar或其他可访问Registrar类中。

我问的原因是我正在用Java编写一个国际象棋游戏。 我正在考虑Piece-Cell关系和Piece-Player关系。 如果在上面的例子中, Student可以访问Registrar服务机构并不合适,那么在这里可以让Piece有机会进入Board ,因为一件Piece无论如何都需要环视以决定一个移动是否有效?

这种情况下的标准做法是什么?


如果关系可以改变 - 类应该尽可能地去耦,所以每个类和每个类一起创建一个接口,不要在类之间引入关联关系。 使用封装类之间通信逻辑的中间服务/帮助程序可以实现高级别的分离,因此在这种情况下,您不应该向另一个类注入一个类,即使两个类都被接口抽象出来,基本上StudentClass没有任何了解,并且ClassStudent一无所知。 我不确定这种复杂性是否适合您的情况,但无论如何您都可以实现。

在这里你可能会发现一个有用的设计模式Mediator,它可以封装两个分离实体之间的交互逻辑,看看它。

使用中介模式,对象之间的通信使用中介对象进行封装。 对象不再直接相互通信,而是通过中介进行通信。 这减少了通信对象之间的依赖关系,从而降低了耦合度。


我认为你在你的很好的例子和解释中发现,OO并没有很好地解决所有问题。 只要责任​​心良好,锐利,一切都很好。 只要每个责任恰好适合一个桶(该类),设计起来就非常容易。 但在这里你有一个权衡:

  • 如果我为每个责任定义一个单独的课程,我会得到一个很难理解(有时需要维护)的臃肿设计。
  • 如果我为每个单独的责任包含至少一个接口,我将获得比我需要的更多的类和接口。
  • 如果我决定两个类中的一个对这个关系负责,那么这个对象比另一个有更多的知识。
  • 如果你在每种情况下引入一个调解员或类似的东西,你的设计将比问题更复杂。
  • 所以也许你应该问一些问题:

  • 两个对象之间的关系可能会改变的可能性是什么?
  • 在每一端的更多类型的对象之间存在关系的可能性是多少?
  • 这个系统的一部分是一个非常明显的部分,所以许多其他部分将会与它接口(因此会依赖于它)?
  • 以最简单的解决方案,可能工作,并开始。 只要解决方案简单易懂,它只是您的代码(您不需要为其他人设计一个库),您可以稍后改变设计而不必麻烦。

    所以在你的具体情况下,

  • 董事会领域应该可以访问整个XOR板
  • 该领域的人物应该有移动XOR的责任
  • 应该有一个对象类型(ChessGame?),负责移动,阻止,攻击的整体知识......
  • 我认为这一切都是有效的,而且这取决于你的特殊“商业案例”,哪一个最有效。

    链接地址: http://www.djcxy.com/p/9037.html

    上一篇: OOP: How do I deal with objects that have mutual relations?

    下一篇: Composition with the same trait, but different type parameters