請教一個observer設計問題。

darasion發表於2008-12-21
剛剛學了一點事件處理,準備做個程式設計練習。
可是一到實踐,就出現了很多問題。具體是這樣的:

1、一個坦克大戰遊戲;
2、戰場上有M枚飛行中的導彈;
3、戰場上有N輛行進中的坦克;

如何處理下面兩種事件?

事件1:坦克被導彈擊中
事件2:導彈擊中了坦克

也就是說:一枚導彈擊中了坦克的同時,就有一輛坦克被這枚導彈擊中。

我的問題是,如何檢測這兩個事件的發生比較好呢?

1、坦克獲得每個導彈的位置,並檢測是否相撞,如果相撞則呼叫this.notifyTankAttacked()和hisMissile.notifyMissileHitTank();

2、導彈獲得每個坦克的位置,並檢測是否相撞,如果相撞則呼叫this.notifyMissileHitTank()和hisTank.notifyTankAttacked();

3、由其他執行緒獲得坦克和導彈的位置,迴圈每個坦克,再拿每個坦克的位置跟每個導彈的位置相比較,迴圈巢狀;當確認相撞後,呼叫tank.notifyTankAttacked()和

missile.notifyMissileHitTank();

4、有其他更好的辦法。。。

//////////////////////以下是部分程式碼/////////////////////
這裡有些不知所措,

我該如何定義事件?
這裡僅考慮了tankAttacked()這個事件,它有兩個參與者
1、發生該事件的坦克
2、擊中坦克的導彈
如果坦克還有其他事件,如:tankFire()坦克開炮/tankMove()坦克移動/tankDie()坦克死掉/...
那麼在這些事件中,第二個引數attackerMissile(擊中坦克的導彈)將沒有任何用處了。
同樣的問題也在MissileEvent中存在。
不知道這裡應該如何處理?
我在想,這個TankEvent事件可不可以看作是DTO?也就是粗粒度的,我可以把所有可能用到的屬性都加上,不用的屬性就傳遞成null即可了?

public class TankEvent{
	private Tank tank;
	private Missile attackerMissile;
	//getter/setter
	//...
}

public class MissileEvent{
	private Missile missile;
	private Tank tankAttacked;
	////getter/setter
	//...
}

//坦克
public class Tank{
	//...
	private List<TankEventListener> listeners;
	public void notifyTankAttacked(){
		for(Iterator<TankEventListener> i = listeners.iterator();i.hasNext();){
			i.next().tankAttacked(new TankEvent(...));
		}
	}
}

//導彈
public class Missile{
	//...
	private List<MissileEventListener> listeners;
	public void notifyMissileHitTank{
		for(Iterator<MissileEventListener> i = listeners.iterator();i.hasNext();){
			i.next().missileHitTank(new MissileEvent(...));
		}
	}
}


public interface TankEventListener{
	public void tankAttacked(TankEvent e);
	//...
}

public interface MissileEventListener{
	public void missileHitTank(MissileEvent e);
	//...
}
<p class="indent">

[該貼被darasion於2008-12-21 19:03修改過]

[該貼被darasion於2008-12-21 20:11修改過]

相關文章