递归回调到虚方法

时间:2018-02-28 16:54:18

标签: java design-patterns composite

我正在实现复合设计模式,我注意到我有许多遍历代码重复。

例如:

class Composite extends BaseComposite{

    LinkedList<BaseComposite> objs;

    public BaseComposite foo(int id){
        for(BaseComposite obj : objs){
            if(obj.getId() == id){
                return obj;
            }
            BaseComposite tmp = obj.foo(id);
            if(tmp != null){
                return tmp;
            }
        }

        return null;
    }

    public BaseComposite bar(int id){
        for(BaseComposite obj : objs){
            if(obj.getId() == id){
                return obj;
            }
            BaseComposite tmp = obj.bar(id);
            if(tmp != null){
                return tmp;
            }
        }

        return null;
    }
}

class Leaf extends BaseComposite{
    public BaseComposite foo(int id){
        if(this.id == id){
            return this;
        }
        return null;
    }

    public BaseComposite bar(int id){
        return null;
    }
}

有没有办法阻止Composite类中的代码重复?有没有办法让“回调”成为虚拟方法?

我宁愿避免反思。

1 个答案:

答案 0 :(得分:1)

在Java 8中,您只能传递一个递归方法并将函数作为第二个参数传递。然后你将this::foothis::bar作为参数传递。一些事情:

public BaseComposite traverse(BiFunction<Integer, BaseComposite, BaseComposite> f, int id){
        for(BaseComposite obj : objs){
            if(obj.getId() == id){
                return obj;
            }
            BaseComposite tmp = f.apply(obj, id);
            if(tmp != null){
                return tmp;
            }
        }

        return null;
    }

    public BaseComposite foo(int id){
        return traverse(this::foo, id);
    }

    public BaseComposite bar(int id){
        return traverse(this::bar, id);
    }
相关问题