我将通过使用一个简单的 BoomState 对象来使用依赖注入模式,而不是丑陋的全局状态(或单例,这只是一种奇特的方式):
class BoomState {
private final List<Explosion> booms = new ArrayList<Explosion>();
public void addBoom() {
booms.add(new Explosion());
}
public List<Explosion> getBooms() {return Collections.unmodifiableList(booms);}
}
并将它传递给需要它的人。
请注意,这不是线程安全的,因此如果被多个线程访问(例如使用CopyOnWriteArrayList
.
一种替代方法是使用观察者模式。您的 BoomState 将保留“活动”子弹列表并“监听”子弹状态并在子弹状态更改为 EXPLODED 时更新繁荣列表。就像是:
class BoomState {
private final List<Explosion> booms = new ArrayList<Explosion>();
private final Set<Bullet> liveBullets = new HashSet<Bullet>();
// to be called by your weapon or bullet factory
public void addLiveBullet(final Bullet bullet) {
liveBullets.add(bullet);
bullet.onExplode(new Runnable() {
@Override public void run() {
addBoom();
liveBullets.remove(bullet);
}
});
}
public void addBoom() {...}
public List<Explosion> getBooms() {...}
}
你子弹:
class Bullet {
private final List<Runnable> onExplode = ...
public void onExplode(Runnable r) { onExplode.add(r); }
public void doExplode() {
//show some colours
for (Runnable r : onExplode) r.run();
}
}