抽象ArrayList <e>迭代来构建可重用的方法</e>

时间:2014-02-14 15:34:31

标签: java design-patterns arraylist iterator abstract

目前我的代码工作但重复:

Iterator<Moo> it6 = moos.iterator();
   while (it6.hasNext()) {
      Moo m = it6.next();
      m.update();
      if (!m.isActive())
         it6.remove();
}

Iterator<Pip> it7 = pips.iterator();
   while (it7.hasNext()) {
      Pip s = it7.next();
      s.update();
      if (!s.isActive())
         it7.remove();
}

... and other ...

在该类别上定义了点数和moos:

public class GameEngine {
   private ArrayList<Moo> moos;
   private ArrayList<Pip> pips;
   ...

和Class Moo / Pip一样:

public class Moo extends GameSprite {
   ...

public class Pip extends GameSprite {
   ...

我可以使用一些设计模式(或一些不同的实现)来减少编写代码并使其更优雅吗?

4 个答案:

答案 0 :(得分:1)

如果您在isActive()中声明update()GameSprite,则可以使用通用方法:

private static void update(List<? extends GameSprite> sprites) {

    Iterator<? extends GameSprite> it = sprites.iterator();
    while (it.hasNext()) {
      GameSprite s = it.next();
      s.update();
      if (!s.isActive())
         it.remove();
    }
}

然后只需用

调用它
update(pips);
update(moos);

答案 1 :(得分:1)

确保GameSprite类具有isActive()和update()作为方法(如果实现不相同,则为abstract)

   public void removeInactive(ArrayList<? extends GameSprite> itList){
        Iterator<GameSprite> it = itList.iterator();
        while (it.hasNext()) {
            GameSprite s = it.next();
            s.update();
            if (!s.isActive())
                it.remove();
        }
    }

答案 2 :(得分:1)

您需要一个通用界面,提供您所有类实现的update()isActive() methods. Either pull them up to the GameSprite class, or add another interface (e.g., Updatable`。

完成后,您可以将此常用代码提取到方法中:

public updateAll (Iterable<? extends GameSprite> sprites) {
   Iterator<? extends GameSprite> it = sprites.iterator();
   while (it.hasNext()) {
      GameSprite s = it.next();
      s.update();
      if (!s.isActive())
         it.remove();
}

答案 3 :(得分:0)

创建界面Updatable

public interface Updatable {
    void update();
    boolean isActive();
}

并让MooPip实现该接口。那么你的通用方法如下所示:

public void update(List<? extends Updatable> items) {
    Iterator<? extends Updatable> it6 = items.iterator();
    while (it6.hasNext()) {
        Updatable m = it6.next();
        m.update();
        if (!m.isActive())
            it6.remove();
    }
}