我目前在设计类时遇到了循环依赖的问题。
自从我阅读了贫血领域模型(我之前一直在这么做),我一直在努力摆脱创建那些只是“getter和setter桶”的领域对象并重回面向对象的本质。
然而,下面的问题是我经常遇到的,我不确定该如何解决它。
假设我们有一个团队(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 也提出了一个很好的观点。在我描述的情况下,球员有可能离开一个团队(并且知道他是否在团队中),同时团队也可能驱逐球员。但我同意你的观点,我不喜欢这个过程有两个“入口”的想法。再次感谢。