Sie sollten über einen sehr genau definierten Satz von Schnittstellen verfügen, die zum Senden oder Empfangen von Nachrichten berechtigt sind. Die Angabe eines Verweises auf einen EventScheduler sollte trivial sein. Wenn dies nicht der Fall ist oder Sie der Meinung sind, dass der Event Scheduler an "zu viele" verschiedene Typen übergeben werden muss, liegt möglicherweise ein größeres Designproblem vor Ihnen (eine promiskuitive Abhängigkeit, die Singletons eher verschlimmern, als lösen) ).
Denken Sie daran, dass Sie in diesem Fall keine neue Abhängigkeit injizieren , obwohl die Technik, den Scheduler an die benötigten Schnittstellen weiterzuleiten, eine Form der " Abhängigkeitsinjektion " ist. Dies ist eine Abhängigkeit, die Sie bereits im System haben, aber Sie machen es jetzt zu einer expliziten (im Vergleich zu der impliziten Abhängigkeit eines Singletons). Als Faustregel gilt, dass explizite Abhängigkeiten vorzuziehen sind, da sie sich selbst besser dokumentieren.
Sie können sich auch mehr Flexibilität verschaffen, indem Sie die Benutzer der Ereignisplanung voneinander entkoppeln (da sie nicht unbedingt alle an denselben Planer gebunden sind). Dies kann nützlich sein, um lokale Client / Server-Setups oder eine Reihe anderer Optionen zu testen oder zu simulieren - Möglicherweise benötigen Sie diese anderen Optionen nicht, aber Sie haben keine Anstrengungen unternommen, um sich künstlich von ihnen abzuhalten, was von Vorteil ist.
BEARBEITEN: Alles, was ich meine, wenn ich über das Weitergeben des Schedulers spreche, ist Folgendes: Wenn Sie eine Spielkomponente haben, die für die Reaktion auf Kollisionen verantwortlich ist, wird sie wahrscheinlich über eine Collision-Responder-Factory erstellt, die Teil Ihrer Physik-Ebene ist. Wenn Sie die Factory mit einer Scheduler-Instanz erstellen, kann sie diese Instanz an alle von ihr erstellten Responder übergeben, die sie dann zum Auslösen von Ereignissen (oder zum Abonnieren anderer Ereignisse) verwenden können.
class CollisionResponderFactory {
public CollisionResponderFactory (EventScheduler scheduler) {
this.scheduler = scheduler;
}
CollisionResponder CreateResponder() {
return new CollisionResponder(scheduler);
}
EventScheduler scheduler;
}
class CollisionResponder {
public CollisionResponder (EventScheduler scheduler) {
this.scheduler = scheduler;
}
public void OnCollision(GameObject a, GameObject b) {
if(a.IsBullet) {
scheduler.RaiseEvent(E_BIG_EXPLOSION);
}
}
EventScheduler scheduler;
}
Dies ist offensichtlich ein furchtbar konstruiertes und vereinfachtes Beispiel, da ich nicht weiß, was Ihr Spielobjektmodell ist. Es veranschaulicht jedoch, wie die Abhängigkeit vom Ereignis - Scheduler explizit dargestellt wird, und weist ein gewisses Potenzial für eine weitere Kapselung auf (Sie müssten die Responder nicht unbedingt an den Scheduler weiterleiten, wenn sie auf derselben konzeptionellen Ebene wie der an ein übergeordnetes Kollisionsreaktionssystem kommuniziert haben Dies würde jede einzelne Responder-Implementierung von den Implementierungsdetails des Ereignis-Dispatch-Systems isolieren, beispielsweise welches spezifische Ereignis bei einer Kollision ausgelöst werden soll, was für Ihr System ideal sein könnte. - oder nicht).