Immagina di avere un gioco, con Mostri, Missioni, Veicoli e, naturalmente, i loro controllori e così, quindi una classe Monster, una classe Mission Controller, una classe Vehicle Controller e così via.
Supponiamo che io abbia bisogno del controller di missione per parlare con i mostri. Perché? Diciamo che quando viene attivata la Missione A, tutti i Mostri ora diventano blu, dal loro colore originale.
Ci sono molti modi per far dialogare il Mission Controller con la classe Monster. Un modo è usare il pattern Observer. Il MissionController aggiungerebbe il Mostro alla sua lista di osservatori, e quando il MissionController cambia Missioni, dice al Mostro usando ONMISSIONCHANGED () o qualcosa del genere.
Il problema con questo approccio è il motivo per cui il Monster dovrebbe interessarsi a MissionController? Monster non dovrebbe nemmeno sapere che esiste MissionController? Supponiamo che un giorno non vogliamo che il mostro cambi colore, vogliamo che i veicoli lo facciano, quindi dobbiamo sbarazzarci dei mostri dalla lista degli osservatori, reimplementare la stessa cosa in Veicoli e aggiungere veicoli all'elenco, non è noioso?
Un altro approccio è usare Singletons, c'è qualche classe onnipotente che ha un puntatore a Mostri, Veicoli, qualunque cosa. E il MissionController può ottenere immediatamente un riferimento alla classe Monster. Ma i Singletons sono cattivi, e creare solo singleton per comunicare tra missioni e mostri è solo un altro trucco.
La mia domanda è allora, se il MissionController vuole impostare / ottenere una proprietà di Monster, come lo farebbe? Come posso evitare che Monster conosca MissionController, ma dì al MissionController di parlare di Monster?
TL: DR - Come si consente la comunicazione tra due oggetti completamente indipendenti, se non si desidera che si conoscano l'un l'altro, E non utilizzare il pattern Observer?
EDIT:
Quindi sembra che l'idea sia usare Mediator e messaggi, creare una classe Mediator, chiamarla MissionCommunicator, e ha una lista di osservatori in cui uno di questi sarebbe il mostro. Quando MissionController vuole parlare all'esterno, MissionCommunicator passa il messaggio all'esterno tramite l'interfaccia IMissionMessage o qualcosa del genere.
In tal caso, quindi Monster dovrebbe implementare IMissionMessage per ascoltare quel messaggio.
Ora, immagina di avere MissionController, VehicleController, AchievementController, AnimalController, eccetera .....
Supponiamo, per qualche motivo, che Monster, per lo stesso motivo per cui ha bisogno di parlare con MissionController, dovrà parlare anche con tutti quelli che lo sono.
Se lasciamo che Monster comunichi usando mediatori, ora dobbiamo fare un mediatore per Veicolo, Achievement, Animal, blahblahblah
e la classe Monster diventa questa:
Mostri classe Monster IMissionMessage, IAchievementMessage, IAnimalMessage .....
Ovviamente puoi usare l'ereditarietà dell'interfaccia per far fronte a questa situazione, crea un'interfaccia genitore IMessage che sottoclassi le interfacce IMissionMessage se stai usando Java.
Ma quale sarebbe la soluzione migliore?