正如Johnn Blade在對該問題的評論中留下的,使用Observer Pattern可能是在應用程序的不同部分之間溝通狀態更改的好方法。作爲一個具體的例子,你可能會把玩家的移動分解成幾個可以被應用程序的其他部分觀察到的離散步驟(或事件)。
例如,如果您添加以下事件給玩家:
- BeforeMove(座標oldCoordinate,座標newCoordinate,OUT BOOL canMove)
- 移動(座標oldCoordinate,座標newCoordinate)
- HealthChanged (INT newHealth)
和場景中的其他對象可以具有事件,例如:
- DamagePlayer(INT損壞)
- HealPlayer(INT癒合)
當你欲動的球員,你會觸發BeforeMoved事件 - 如果沒有與canMove = false
響應(如鎖上大門) ,那麼這個舉動是被允許的。然後你更新玩家的位置,並調用Moved。
所以,你可以秒殺監聽玩家感動的事件:
void Moved(Coordinate oldCoordinate, Coordinate newCoordinate)
{
if (newCoordinate.Intersects(this.Location))
{
DamagePlayer(50);
}
}
相應播放器將監聽DamagePlayer事件。
void DamagePlayer(int damage)
{
this.Health -= damage;
HealthChanged(this.Health);
}
東西(可能在玩家本身)會聽取HealthChanged事件,當它達到零或更少時,殺死玩家。
使用此模式,添加檢測下降等新功能相對簡單。只要創建的感動事件的新的觀察員:
void Moved(Coordinate oldCoordinate, Coordinate newCoordinate)
{
decimal deltaY = oldCoordinate.Y - newCoordinate.Y;
if (deltaY < -100) // If fell 100 units or more, take 10 damage per unit.
{
DamagePlayer(10 * Math.Abs(deltaY));
}
}
看看中保設計模式 – Mithir
還是看看觀察者模式http://www.dofactory.com/Patterns/PatternObserver.aspx – JohnnBlade
我認爲OP的問題是針對GRASP這樣的高層次模式 – GETah