【问题标题】:Avoiding circular depenency between Arena and Portal避免 Arena 和 Portal 之间的循环依赖
【发布时间】:2022-01-11 06:15:42
【问题描述】:

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

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 的 找到了解决方案,但是我想弄清楚这是否是解决这个问题的更好方法以促进学习和进步。

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

【问题讨论】:

    标签: java oop design-patterns


    【解决方案1】:

    你可以使用依赖倒置,所以Portal不会依赖Arena

    interface Startable{
      void start();
    }
    
    class Arena extends Startable{...}
    

    然后:

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

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

    【讨论】:

    • 关闭竞技场和传送门时如何工作?
    • @user_020599 与您的示例代码中的相同。竞技场关闭传送门
    【解决方案2】:

    为什么不是ArenaPortal 的包装类:

    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
        }
     
        //....
    
    }
    

    【讨论】:

    • 这不只是循环依赖的附加层吗?或者如何存储。在 Portal 和 Arena 类内部还是?
    • 这不是带有Arena 字段的Portal 类和带有Portal 字段的Arena 类。两个实例之间的关系都在包装类中,因此您可以避免任何循环引用。
    • 天哪,这更有意义。他们已经以任何一种方式共享名称:P 非常感谢!
    • 我很高兴它有帮助。这类似于您对HashMap 所做的事情,使用Map.Entry 作为包装类。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2011-03-12
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多