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

标签 java listener circular-dependency

我有一个 Entity 接口(interface),其实现可能会相互冲突。我想添加一个在发生碰撞时调用的 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; }
}

这具有以下循环依赖性:

实体 -> CollisionListener -> CollisionEvent -> 实体

我不确定如何解决此问题(或者是否可以解决),因为 CollisionListener 接口(interface)的实现应该能够访问受影响的 Entity 对象碰撞,以便它可以对它们采取行动(例如,调用 dealDamagedie 方法。

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

最佳答案

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

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

但是,如果您仍然不希望资源彼此了解,请考虑 Mediator pattern ,它基本上只是说明,您不是让资源相互通信,而是让中介对象了解它们,并处理它们之间的通信。

关于java - 如何删除这种循环类依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37009807/

相关文章:

java - 使用 APDU 将 CAP 文件上传到智能卡

java - 使用下载管理器从 AsyncTask 下载文件

java - 动态生成枚举

Android Gradle 构建和循环依赖

Angular:如何解决指令和组件之间的循环依赖?

java - 为 JTable 中第一列的单元格加载 JList

android - 在 Kotlin 中实现滑动手势

javascript - 有没有办法在 JS 中监听特定位置 "from left"?

javascript - 使用 CKEditor 在 setData 和模式更改时重置监听器事件

c++ - 循环依赖...怎么解决?