Powinieneś mieć bardzo dobrze zdefiniowany zestaw interfejsów, które mogą transmitować lub odbierać wiadomości - podanie im odwołania do EventScheduler powinno być trywialne. Jeśli tak nie jest, lub jeśli uważasz, że to wymagałoby przekazania harmonogramu wydarzeń do „zbyt wielu” różnych typów, możesz mieć większy problem projektowy na rękach (rozwiązana zależność, której singletony mają tendencję do zaostrzania, a nie rozwiązywania ).
Pamiętaj, że chociaż technika przekazywania harmonogramu do potrzebnych interfejsów jest formą „ wstrzykiwania zależności ”, w tym przypadku nie wprowadza się nowej zależności. Jest to zależność, którą już masz w systemie, ale teraz czynisz ją jawną (w porównaniu z domyślną zależnością singletona). Zasadą jest, że wyraźne zależności są bardziej preferowane, ponieważ są bardziej samo-dokumentujące.
Zapewniasz sobie również większą elastyczność, oddzielając od siebie odbiorców harmonogramu zdarzeń (ponieważ nie wszyscy oni są koniecznie powiązani z tym samym harmonogramem), co może być przydatne do testowania lub symulacji lokalnych ustawień klient / serwer lub szeregu innych opcji - możesz nie potrzebować tych innych opcji, ale nie dołożyłeś starań, aby sztucznie się od nich ograniczyć, co jest plusem.
EDYCJA: Mam na myśli, gdy mówię o przekazywaniu harmonogramu, to: jeśli masz jakiś element gry, który jest odpowiedzialny za reagowanie na kolizję, prawdopodobnie jest on tworzony przez fabrykę reagowania na kolizję, która jest częścią twojej warstwy fizycznej. Jeśli zbudujesz fabrykę za pomocą instancji programu planującego, może ona przekazać tę instancję do wszystkich tworzonych przez nią obiektów odpowiadających, które mogą następnie wykorzystać ją do wywoływania zdarzeń (lub być może subskrybować inne zdarzenia).
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;
}
To oczywiście strasznie wymyślony i uproszczony przykład, ponieważ nie wiem, jaki jest twój model obiektowy gry; ilustruje to jednak wyraźne uzależnienie od harmonogramu zdarzeń i pokazuje pewien potencjał do dalszego enkapsulacji (niekoniecznie trzeba by przekazywać responderom harmonogram, gdyby komunikowali się z systemem odpowiedzi na kolizję wyższego poziomu na tym samym poziomie koncepcyjnym, co fabryka, która poradziła sobie z problemami związanymi z wywoływaniem zdarzeń za pośrednictwem harmonogramu. To odizolowałoby każdą implementację odpowiadającego od szczegółów implementacji systemu wysyłania zdarzeń, takich jak które konkretne zdarzenie wywołać w przypadku kolizji, które może być idealne dla twojego systemu - - albo nie).