2013-03-20 39 views
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條件與一個新的f.e. areEnemies(Element pivot,Element a)並繼續使用整個代碼和數據結構。我試圖提取一個無效方法,但在這種情況下,我必須通過所有變量(db,隊列等)作爲輸入,它看起來像一個反模式。你有什麼想法如何解決這個問題?謝謝!

回答

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

傳遞您的關係對象ECT你的方法:

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

... 
} 
+0

謝謝!它像一個魅力! – uccie 2013-03-20 16:44:05

+0

+1簡單而有效 – 2013-03-20 16:49:46

0

您可以使用Command設計模式。使用方法public void checkElements(Element a, Element b)創建一個接口,並創建該接口的幾個實例。在你的方法中,使用接口的方法,或者讓你的方法接受一個接口實例作爲參數,或者把它作爲一個類成員。

3

你可以定義一個interface

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

interface的通實現(無論是命名或匿名class ES)公用功能:

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