Dovresti avere un set ben definito di interfacce che possono trasmettere o ricevere messaggi - dare loro un riferimento a un EventScheduler dovrebbe essere banale. Se non lo è, o se ritieni che ciò implicherebbe il passaggio del programmatore di eventi a "troppi" tipi distinti, potresti avere un problema di progettazione più grande tra le mani (una dipendenza promiscua, che i singoli tendono ad esacerbare, non a risolvere ).
Ricorda che mentre la tecnica di passare lo scheduler alle interfacce che ne hanno bisogno è una forma di " iniezione di dipendenza ", in questo caso non stai iniettando una nuova dipendenza. Questa è una dipendenza che hai già nel sistema, ma ora la stai rendendo esplicita (rispetto alla dipendenza implicita di un singleton). Come regola generale, le dipendenze esplicite sono più preferibili in quanto sono più auto-documentate.
Ti permetti anche una maggiore flessibilità disaccoppiando gli utenti della pianificazione degli eventi l'uno dall'altro (poiché non sono necessariamente tutti legati allo stesso programmatore), che può essere utile per testare o simulare le configurazioni client / server locali o una serie di altre opzioni - potresti non aver bisogno di queste altre opzioni, ma non hai speso sforzi per limitarti artificialmente a loro, il che è un vantaggio.
EDIT: Tutto ciò che intendo quando parlo di passare lo schedulatore in giro è questo: se hai qualche componente di gioco che è responsabile della risposta alla collisione, è probabilmente creato tramite una fabbrica di risponditore di collisioni che fa parte del tuo livello fisico. Se costruisci la factory con un'istanza dello scheduler, può quindi passare quell'istanza a tutti i responder che crea, che può quindi farne uso per generare eventi (o forse iscriversi ad altri eventi).
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;
}
Questo è ovviamente un esempio terribilmente inventato e semplificato poiché non so quale sia il tuo modello di oggetto di gioco; tuttavia illustra esplicitamente che rende esplicita la dipendenza dal programma di pianificazione degli eventi e mostra un potenziale di ulteriore incapsulamento (non è necessario passare i risponditori al programma di pianificazione se comunicano attraverso un sistema di risposta alle collisioni di livello superiore allo stesso livello concettuale del una fabbrica che si occupava degli aspetti fondamentali della raccolta di eventi tramite lo scheduler. Ciò isolerebbe l'implementazione di ogni singolo risponditore dai dettagli di implementazione del sistema di invio degli eventi, come ad esempio quale evento specifico sollevare in caso di collisione, che potrebbe essere l'ideale per il tuo sistema - - o no).