醜いグローバル状態 (または同じことを行うための単純な方法であるシングルトン) の代わりに、単純な 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
。
1 つの代替方法は、Observer パターンを使用することです。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();
}
}