Debe tener un conjunto de interfaces muy bien definido que pueda transmitir o recibir mensajes; darles una referencia a EventScheduler debería ser trivial. Si no lo es, o si cree que eso implicaría pasar el planificador de eventos a "demasiados" tipos distintos, entonces podría tener un problema de diseño más grande en sus manos (una dependencia promiscua, que los puntos únicos tienden a exacerbar, no resolver )
Recuerde que si bien la técnica de pasar el programador a las interfaces que lo necesitan es una forma de " inyección de dependencia ", en este caso no está inyectando una nueva dependencia. Esta es una dependencia que ya tiene en el sistema, pero ahora la está haciendo explícita (frente a la dependencia implícita de un singleton). Como regla general, las dependencias explícitas son más preferibles ya que se documentan mejor.
También se brinda más flexibilidad al desacoplar entre sí los consumidores de la programación de eventos (ya que no todos están necesariamente vinculados al mismo programador), lo que puede ser útil para probar o simular configuraciones locales de cliente / servidor o una serie de otras opciones - Es posible que no necesite estas otras opciones, pero no ha realizado ningún esfuerzo para restringirse artificialmente de ellas, lo cual es una ventaja.
EDITAR: todo lo que quiero decir cuando hablo de pasar el programador es esto: si tienes algún componente del juego que es responsable de responder a la colisión, probablemente se crea a través de una fábrica de respuesta a colisiones que es parte de tu capa de física. Si construye la fábrica con una instancia de planificador, puede pasar esa instancia a cualquier respondedor que cree, que luego puede usarla para generar eventos (o tal vez suscribirse a otros eventos).
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;
}
Obviamente, este es un ejemplo terriblemente artificial y simplificado, ya que no sé cuál es su modelo de objeto de juego; sin embargo, ilustra hacer explícita la dependencia en el planificador de eventos y muestra cierto potencial para una mayor encapsulación (no necesariamente tendría que pasar a los respondedores el planificador si se comunicaban a un sistema de respuesta de colisión de nivel superior en el mismo nivel conceptual que el fábrica que se ocupó de los aspectos básicos de la generación de eventos a través del programador. Esto aislaría cada implementación de respondedor individual de los detalles de implementación del sistema de envío de eventos, como qué evento específico generar en caso de colisión, que puede ser ideal para su sistema: - o no).