假设通过某种关系有两个相互关联的类。例如,Student
维护一个Class
es列表,每个Class
都有一个Student
列表。然后我害怕Student
能够直接修改其Class
es的集合,因为每次修改后都必须对Class
的{{1}}列表进行类似的修改。 Student
s,反之亦然。
一个解决方案是创建一个类,其唯一目的是跟踪Class
- Student
关系,例如Registrar
。但是,如果Student
中的某个方法需要了解其Class
列表,则Student
需要传递Registrar
。这看起来很糟糕。似乎Student
不应该访问Registrar
,它也可以访问其他Student
。我可以想到一个解决方案,创建一个充当Student
和Registrar
之间的中介的类,只显示它需要知道的Student
,但这似乎有点矫枉过正。另一种解决方案是从Student
中删除需要访问其类的任何方法,并将其放在Registrar
或其他有权访问Registrar
的类中。
我问的原因是我正在使用Java进行国际象棋游戏。我正在考虑Piece-Cell关系和Piece-Player关系。如果在上面的示例中,Student
无法访问Registrar
,那么Piece
是否可以访问Board
,因为Piece
需要环顾四周来决定移动是否有效?
在这种情况下,标准做法是什么?
答案 0 :(得分:2)
如果关系可以改变 - 类应该尽可能地解耦,所以随着每个类创建一个接口,不要在类之间引入绑定关系。
使用封装类之间通信逻辑的中间服务/帮助程序可以实现高级别的分离,因此在这种情况下,您不应该将一个类注入到另一个类中,即使两个类都被接口抽象,基本上Student
也不知道任何事情大约Class
,而Class
对Student
一无所知。我不确定这种复杂性在你的情况下是否有意义,但无论如何你都可以实现它。
您可以在这里找到一个有用的design pattern Mediator,它可以封装两个解耦实体之间的交互逻辑,看看它。
使用中介模式,对象之间的通信就是 用中介对象封装。对象不再通信 彼此直接相关,而是通过相互沟通 调解员。这减少了通信对象之间的依赖关系, 从而降低了耦合。
答案 1 :(得分:1)
我认为你在你非常好的例子和解释中找到的是OO并没有很好地解决所有问题。只要责任形状和锐利,一切都很好。只要每个职责只适合一个桶(该类),它就很容易设计。但在这里你有一个权衡:
所以也许你应该问问题:
采用可能有效的最简单的解决方案并从中开始。只要解决方案保持简单,只有您的代码(您不为其他人设计库),您可以稍后更改设计而不会有麻烦。
所以在你的具体案例中,
我认为一切都是有效的,这取决于你的特殊“商业案例”,哪一个是最有效的。