【发布时间】:2011-04-29 18:40:08
【问题描述】:
我目前在设计课程时遇到循环依赖问题。
自从我读到Anemic Domain Model(我一直在做的事情)以来,我一直在努力摆脱创建只是“getter 和 setter 桶”的域对象,并回到我的 OO 根源.
但是,下面的问题是我经常遇到的问题,我不知道应该如何解决。
假设我们有一个 Team 类,它有很多 Players。这是什么运动并不重要 :) 球队可以添加和删除球员,就像球员可以离开球队并加入另一个球队一样。
所以我们有球队,其中有一个球员名单:
public class Team {
private List<Player> players;
// snip.
public void removePlayer(Player player) {
players.remove(player);
// Do other admin work when a player leaves
}
}
然后我们有 Player,它引用了 Team:
public class Player {
private Team team;
public void leaveTeam() {
team = null;
// Do some more player stuff...
}
}
可以假设这两种方法(移除和离开)都具有特定于域的逻辑,每当球队移除一名球员并且一名球员离开球队时,该逻辑都需要运行。因此,我的第一个想法是,当一个Team踢一个球员时,removePlayer(...) 也应该调用 player.leaveTeam() 方法...
但是如果 Player 正在推动离开怎么办 - leaveTeam() 方法应该调用 team.removePlayer(this) 吗?并非没有创建无限循环!
在过去,我只是让这些对象“哑”POJO,并让服务层来完成这项工作。但是即使现在我仍然存在这个问题:为了避免循环依赖,服务层仍然将它们链接在一起 - 即
public class SomeService {
public void leave(Player player, Team team) {
team.removePlayer(player);
player.leaveTeam();
}
}
我是否过于复杂了?也许我错过了一些明显的设计缺陷。任何反馈将不胜感激。
感谢大家的回复。我接受 Grodriguez 的解决方案,因为它是最明显的(不敢相信我没有想到)并且易于实施。但是,DecaniBass 确实是一个很好的观点。在我所描述的情况下,一名球员可能会离开一支球队(并注意他是否在一支球队中)以及推动移除的球队。但我同意你的观点,我不喜欢这个过程有两个“入口点”。再次感谢。
【问题讨论】:
标签: java oop circular-dependency