java - 递归回调虚拟方法

标签 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 类中的代码重复?有没有办法拥有一个虚拟方法的“回调”?

我更喜欢避免反射(reflection)。

最佳答案

在 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);
    }

关于java - 递归回调虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49034744/

相关文章:

c++ - 提高克隆模式的安全性

c++ - 如何访问类的私有(private)数据成员中的方法/函数

c++ - 我无法理解 Singleton 是如何工作的?

c++ - Composite in C++ 错误 [没有匹配的成员函数来调用 'push_back']

MySQL:如何索引 "OR"子句

java - GWT 复合小部件

java - 使用加速度计和陀螺仪移动鼠标光标

java - PostgreSQL JDBC 池

java - 为什么代码在 "return"之后仍在运行

java - Eclipse Tomcat 服务器启动但代码未部署