TL; DR sotto
Sto lavorando su un server di gioco (in Java, ma quella parte è meno importante) e ho deciso di suddividere la logica del server dalla logica del motore; in parte perché si trovano in due diversi domini logici. Il server interagirà direttamente con il client e gestirà l'aspetto della rete delle cose, mentre il motore gestirà gli eventi di gioco. Vorrei che fossero i più distinti possibile, in modo che il motore non si occupi di pacchetti e reti, e il server non si occupi del movimento del giocatore o degli eventi di gioco. Tuttavia, questi due dovranno rimanere accoppiati perché, sebbene si trovino in domini diversi, fanno parte dello stesso processo.
Ad esempio, quando l'utente avvia il proprio client e si connette al server, il server deve inviare un messaggio al motore per creare una nuova sessione di gioco. Il motore quindi inizializza il mondo, aggiunge il giocatore ad esso e registra gli ascoltatori di eventi in-game appropriati. A questo punto, il motore dice al server che il mondo è pronto. Il server invia quindi un client di messaggi per caricare risorse (immagini, dati del paesaggio, testo, ecc.), Registra i gestori di pacchetti e tutto è pronto per essere riprodotto.
Dobbiamo anche prenderlo dall'altra parte. Se il giocatore disconnette il proprio client o si disconnette, il server è il primo a sapere di questo cambiamento di stato. La sessione del server può rimanere attiva, nel caso in cui si tratti solo di un leggero rallentamento della rete, ma alla fine, deve dire al motore di gioco di eseguire qualsiasi operazione di pulizia.
Possono esserci molte implementazioni del motore e del server. Ad esempio, possono essere in esecuzione nella stessa istanza JVM, potrebbero trovarsi su diverse istanze, utilizzare i canali socket per comunicare tra loro, oppure potremmo avere il motore su un altro server, usando qualcosa come un servizio REST per comunicare i messaggi tra loro.
TL; DR
Che tipo di schemi di progettazione o strategie posso utilizzare per inviare messaggi tra due componenti accoppiati, che dovrebbero rimanere il più separati possibile, senza introdurre una libreria intermediario?