有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何删除这种循环类依赖关系?

我有一个Entity接口,它的实现可能会相互冲突。我想添加一个CollisionListener,当冲突发生时调用它,它将接受一个包含两个冲突实体的CollisionEvent。有没有一种方法可以在EntityCollisionListener之间不存在循环依赖关系的情况下做到这一点

我目前拥有:

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对象,以便它可以对它们进行操作(例如,调用dealDamagedie方法)

我知道循环依赖(即代码编译和运行良好)并没有什么错误,但如果可能的话,我宁愿避免它们


共 (1) 个答案

  1. # 1 楼答案

    EntityCollisionListener相互了解其实没什么大不了的;循环依赖性意味着这两个类相互了解(这是有意义的,它是一个内聚系统)。然而,这两者并不是紧密耦合的,因为它们对外部实现细节知之甚少

    为了使这个具体化,请考虑如果要为^ {CD1>}的实现设计一个单元测试。您可以非常轻松地模拟CollisionListener(使用Mockito这样的资源,甚至只是在单元测试中创建一个实现,比如MockCollisionListenerEntity实现不依赖于任何外部实现细节,因此,只要遵守契约接口(CollisionListener),就可以自由更改实现

    然而,如果你仍然不想让你的资源知道彼此,考虑Mediator pattern,它基本上只是陈述,而不是有资源互相交谈,你有一个中介器对象知道它们,并处理它们之间的通信。p>