避免 Arena 和 Portal 之间的循环依赖

Avoiding circular depenency between Arena and Portal

我正在尝试解决这种循环依赖,同时最好保持两个对象不可变。

public class Arena {

    private final Portal portal;

    Arena(Portal portal) {
        this.portal = portal;
    }

    void close() {
        portal.close();
    }

    void start() {

    }
}

public class Portal {

    private final Arena arena;

    Portal(Arena arena) {
        this.arena = arena;
    }

    void close() {

    }

    void start() {
        arena.start();
    }

}

基本上,我需要传送门能够自行激活,并启动竞技场。相反,我需要 Arena 重置并关闭自身和门户。我通过使用两个 HashMap 的 找到了解决方案,但是我想弄清楚它是否是解决这个学习和进步的更好方法。

类在这里变得更加简单,因为实际上它们有更多的变量和标识符。

你可以使用依赖倒置,这样 Portal 就不会依赖 Arena

interface Startable{
  void start();
}

class Arena extends Startable{...}

然后:

class Portal{
  private final Startable arena;
  ...
}

虽然查看了 Arena 和 Portal 方法,但看起来它们并不是一成不变的

为什么不对 ArenaPortal 进行封装 class:

public class PortalArena {

    private final Portal portal;

    private final Arena arena;

    PortalArena(Portal portal, Arena arena) {
        this.portal = portal;
        this.arena = arena;
    }
    
    void startPortal() {
        portal.start();
        arena.start();
        // Rest of the logic here
    }

    void closeArena() {
        arena.close();
        portal.close();
        // Rest of the logic here
    }
 
    //....

}