目前我的代码工作但重复:
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 {
...
我可以使用一些设计模式(或一些不同的实现)来减少编写代码并使其更优雅吗?
答案 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();
}
并让Moo
和Pip
实现该接口。那么你的通用方法如下所示:
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();
}
}