OOP:我如何处理有相互关系的对象?
假设有两个类通过一些关系相互关联。 例如,一个Student
保持列表Class
ES他需要,每个Class
有一个列表Student
还要把它。 然后,我害怕让Student
直接修改它的一组Class
,因为每个修改都必须跟着一个Class
Student
列表的类似修改,反之亦然。
一个解决方案是有一个类,其唯一目的是跟踪的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
无论如何都需要环视以决定一个移动是否有效?
这种情况下的标准做法是什么?
如果关系可以改变 - 类应该尽可能地去耦,所以每个类和每个类一起创建一个接口,不要在类之间引入关联关系。 使用封装类之间通信逻辑的中间服务/帮助程序可以实现高级别的分离,因此在这种情况下,您不应该向另一个类注入一个类,即使两个类都被接口抽象出来,基本上Student
对Class
没有任何了解,并且Class
对Student
一无所知。 我不确定这种复杂性是否适合您的情况,但无论如何您都可以实现。
在这里你可能会发现一个有用的设计模式Mediator,它可以封装两个分离实体之间的交互逻辑,看看它。
使用中介模式,对象之间的通信使用中介对象进行封装。 对象不再直接相互通信,而是通过中介进行通信。 这减少了通信对象之间的依赖关系,从而降低了耦合度。
我认为你在你的很好的例子和解释中发现,OO并没有很好地解决所有问题。 只要责任心良好,锐利,一切都很好。 只要每个责任恰好适合一个桶(该类),设计起来就非常容易。 但在这里你有一个权衡:
所以也许你应该问一些问题:
以最简单的解决方案,可能工作,并开始。 只要解决方案简单易懂,它只是您的代码(您不需要为其他人设计一个库),您可以稍后改变设计而不必麻烦。
所以在你的具体情况下,
我认为这一切都是有效的,而且这取决于你的特殊“商业案例”,哪一个最有效。
链接地址: 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