Você deve ter um conjunto muito bem definido de interfaces com permissão para transmitir ou receber mensagens - fornecer uma referência a um EventScheduler deve ser trivial. Se não estiver, ou se você acha que isso envolveria passar o agendador de eventos para "muitos" tipos distintos, você pode ter um problema maior de design em suas mãos (uma dependência promíscua, que os singletons tendem a exacerbar, não resolver) )
Lembre-se de que, embora a técnica de passar o agendador para as interfaces necessárias seja uma forma de " injeção de dependência ", nesse caso, você não está injetando uma nova dependência. Essa é uma dependência que você já possui no sistema, mas agora a torna explícita (versus a dependência implícita de um singleton). Como regra geral, dependências explícitas são mais preferíveis, pois são mais auto-documentadas.
Você também oferece mais flexibilidade, dissociando os consumidores do agendamento de eventos (já que nem todos estão necessariamente vinculados ao mesmo agendador), o que pode ser útil para testar ou simular configurações locais de cliente / servidor ou várias outras opções. - você pode não precisar dessas outras opções, mas não fez nenhum esforço para se restringir artificialmente a elas, o que é uma vantagem.
EDIT: Tudo o que quero dizer quando falo sobre passar o agendador é o seguinte: se você tem algum componente do jogo responsável por responder à colisão, provavelmente é criado através de alguma fábrica de respondedores de colisão que faz parte da sua camada de física. Se você construir a fábrica com uma instância do agendador, poderá passá-la para todos os respondentes criados, que poderão utilizá-la para gerar eventos (ou talvez se inscrever em outros 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;
}
Este é obviamente um exemplo terrivelmente artificial e simplificado, pois não sei qual é o seu modelo de objeto de jogo; no entanto, ilustra explicitando a dependência do agendador de eventos e mostra algum potencial para encapsulamento adicional (você não precisaria necessariamente passar o respondedor para o agendador se eles se comunicassem através de um sistema de resposta de colisão de nível superior no mesmo nível conceitual que o fábrica que lidava com as porcas e os parafusos de aumento de eventos por meio do agendador.Isso isolaria cada implementação de respondedor individual dos detalhes de implementação do sistema de envio de eventos, como qual evento específico deve ocorrer em colisão, o que pode ser ideal para o seu sistema - - ou não).