首页 > 解决方案 > 初始化时表达相互连接

问题描述

在有一个对象处理多个其他对象的情况下,如何在初始化时表示所有权?

例如,假设有一只鸡孵化多个鸡蛋。小鸡没有父母是不好的,但小鸡也应该只把注意力集中在它的小鸡身上。如果这种关系应该在初始化时表达出来,怎么可能呢?

在这种情况下,哪种设计模式最适合使用?

如果可能,最好避免使用null,因为这可能会给系统带来歧义。如果使用它是不可避免的,如何最好地减少歧义?

示例程序:

public class MyClass {

    /**
     * Handles eggs
     * */
    public static class Chicken{
        private Egg[] eggs;
        
        public Chicken(Egg... eggs_){
            eggs = eggs_;
        }
        
        public void accept_signal(String message){
            /* ... */
        }
    }
    
    /**
     * Signals when its ready to hatch
     * */
    public static abstract class Egg{
        private final Chicken parent;
        public Egg(Chicken parent_){
            parent = parent_;
        }
        
        public void hatch(){
            parent.accept_signal("chirp chirp");
        }
    }
    
    /**
     * The resulting children to be handled
     * */
    public static class YellowChick extends Egg{
        public YellowChick(Chicken parent_){
            super(parent_);
        }
    }
    
    public static class BrownChick extends Egg{
        public BrownChick(Chicken parent_){
            super(parent_);
        }
    }
    
    public static class UglyDuckling extends Egg{
        public UglyDuckling(Chicken parent_){
            super(parent_);
        }
    }

    public static void main (String[] args){
        Chicken momma = new Chicken(
        //  new YellowChick(), new BrownChick(), new UglyDuckling()  /* How can these objects be initialized properly? */
        );
    }

}

标签: javadesign-patterns

解决方案


软件中的循环依赖通常是个坏主意。
像这样的问题的解决方案,

Chicken <--> Egg

...是引入一个管理关系的中间人。
管理器可以以不同的方式实现。

  • Chicken --> PoultryMediator <-- Egg
    在这里,经理充当调解人,在运行时回答查询并提供参考。
  • Chicken <-- PoultryInjector --> Egg
    在这里,管理器充当依赖注入器,在构建时连接对象。

有关一些相关链接,另请参阅:发现循环依赖问题


推荐阅读