3

我有一个方法,我在我的实现中多次使用它,并进行了非常简单的修改。我怎样才能避免重复自己?

...
    while (!queue.isEmpty()) {
        Element pivot = queue.poll();
        elements.remove(pivot);
        for (Element a : elements) {
            if (areFriends(pivot, a)) {
                db.addRelation(a, pivot);
                queue.add(a);
                elements.remove(a);
            }
        }
    }
...

我想用一个新的改变 areFriends 条件,fe areEnemies(Element pivot, Element a) 并继续使用整个代码和数据结构。我试图提取一个 void 方法,但在这种情况下,我必须将所有变量(db、队列等)作为输入传递,它看起来像是一种反模式。你知道如何解决这个问题吗?谢谢!

4

4 回答 4

3

你可以定义一个interface

public interface IElementFunction
{
    public boolean execute(Element e1, Element e2);
}

以及通用函数的传递实现(命名或匿名classes) :interface

private void commonFunction(IElementFunction ief)
{
    while (!queue.isEmpty()) {
        Element pivot = queue.poll();
        elements.remove(pivot);
        for (Element a : elements) {
            if (ief.execute(pivot, a)) {
                db.addRelation(a, pivot);
                queue.add(a);
                elements.remove(a);
            }
        }
    }
于 2013-03-20T16:25:56.080 回答
3

创建接口:

public interface Relation 
{
    public void execute(Element a, Element b);
}


public class AreFriendsRelation implements Relation 
{
    public void execute(Element a, Element b) 
    {
        // Return the Relation result
    }    
}

public class AreEnemiesRelation implements Relation 
{
    public void execute(Element a, Element b) 
    {
        // Return the Relation result
    }    
}

将您的 Relation 对象传递给您的方法:

public void MyMethod(Relation myRelation) {
...
while (!queue.isEmpty()) {
        Element pivot = queue.poll();
        elements.remove(pivot);
        for (Element a : elements) {
            if (myRelation.execute(pivot, a)) {
                db.addRelation(a, pivot);
                queue.add(a);
                elements.remove(a);
            }
        }
    }

...
}
于 2013-03-20T16:27:09.033 回答
0

您可以使用命令设计模式。使用方法创建一个接口public void checkElements(Element a, Element b),并创建该接口的一些实例。在您的方法中,使用接口的方法,或者让您的方法接受接口实例作为参数,或者将其作为类成员。

于 2013-03-20T16:25:12.560 回答
0

嗯..不确定我是否完全理解您的问题,但这看起来像是实现模板方法模式或其他一些行为模式的气味。

检查:http ://en.wikipedia.org/wiki/Template_method_pattern

于 2013-03-20T16:29:29.807 回答