如何删除此循环 class 依赖项?
How can I remove this cyclic class dependency?
我有一个 Entity
接口,其实现可能会相互冲突。我想添加一个在碰撞发生时调用的 CollisionListener
,它将接受包含两个碰撞实体的 CollisionEvent
。有没有一种方法可以在 Entity
和 CollisionListener
之间没有循环依赖?
我目前拥有的:
public interface Entity {
void addCollisionListener(CollisionListener listener);
void getStrength();
void dealDamage();
void die();
// Other methods
}
// To be implemented and added to Entities when you want to watch for collisions
public interface CollisionListener {
void onCollision(CollisionEvent event);
}
public class CollisionEvent {
private final Entity source, collider;
public CollisionEvent(Entity source, Entity collider) {
this.source = source;
this.collider = collider;
}
public Entity getSource() { return source; }
public Entity getCollider() { return collider; }
}
这具有以下循环依赖性:
Entity -> CollisionListener -> CollisionEvent -> Entity
我不确定如何解决这个问题(或者它是否可以解决),因为 CollisionListener
接口的实现应该可以访问受冲突影响的 Entity
对象,所以它可以对它们起作用(例如,调用 dealDamage
或 die
方法。
我知道严格来说没有什么 错误 具有循环依赖性(即代码编译和运行良好),但我宁愿尽可能避免它们。
Entity
和 CollisionListener
相互了解并不是什么大事;循环依赖意味着两个 类 相互了解(这是有道理的;它是一个内聚系统)。但是,两者并非紧耦合,因为它们对外部实现细节知之甚少。
为了具体说明,请考虑是否要为 Entity
的实现设计单元测试。您可以非常轻松地模拟 CollisionListener
(使用像 Mockito 这样的资源,或者甚至只是在单元测试中创建一个实现,例如 MockCollisionListener
)。 Entity
实现不依赖于任何外部实现细节,因此,只要遵守契约接口 (CollisionListener
),就可以自由更改实现。
但是,如果您仍然不希望您的资源相互了解,请考虑 Mediator pattern,它基本上只是说明,您有一个中介对象知道,而不是让资源相互交谈关于它们,并处理它们之间的通信。
我有一个 Entity
接口,其实现可能会相互冲突。我想添加一个在碰撞发生时调用的 CollisionListener
,它将接受包含两个碰撞实体的 CollisionEvent
。有没有一种方法可以在 Entity
和 CollisionListener
之间没有循环依赖?
我目前拥有的:
public interface Entity {
void addCollisionListener(CollisionListener listener);
void getStrength();
void dealDamage();
void die();
// Other methods
}
// To be implemented and added to Entities when you want to watch for collisions
public interface CollisionListener {
void onCollision(CollisionEvent event);
}
public class CollisionEvent {
private final Entity source, collider;
public CollisionEvent(Entity source, Entity collider) {
this.source = source;
this.collider = collider;
}
public Entity getSource() { return source; }
public Entity getCollider() { return collider; }
}
这具有以下循环依赖性:
Entity -> CollisionListener -> CollisionEvent -> Entity
我不确定如何解决这个问题(或者它是否可以解决),因为 CollisionListener
接口的实现应该可以访问受冲突影响的 Entity
对象,所以它可以对它们起作用(例如,调用 dealDamage
或 die
方法。
我知道严格来说没有什么 错误 具有循环依赖性(即代码编译和运行良好),但我宁愿尽可能避免它们。
Entity
和 CollisionListener
相互了解并不是什么大事;循环依赖意味着两个 类 相互了解(这是有道理的;它是一个内聚系统)。但是,两者并非紧耦合,因为它们对外部实现细节知之甚少。
为了具体说明,请考虑是否要为 Entity
的实现设计单元测试。您可以非常轻松地模拟 CollisionListener
(使用像 Mockito 这样的资源,或者甚至只是在单元测试中创建一个实现,例如 MockCollisionListener
)。 Entity
实现不依赖于任何外部实现细节,因此,只要遵守契约接口 (CollisionListener
),就可以自由更改实现。
但是,如果您仍然不希望您的资源相互了解,请考虑 Mediator pattern,它基本上只是说明,您有一个中介对象知道,而不是让资源相互交谈关于它们,并处理它们之间的通信。