Я работаю над небольшой Java-игрой, в которой могут произойти всевозможные события. Есть, по крайней мере, несколько десятков основных событий, которые могут быть заинтересованы различными обработчиками событий. В коде, где эти события могут быть запущены, также есть несколько мест. Вместо того, чтобы заставлять слушателей событий знать, к какому классу они должны зарегистрироваться, я бы хотел создать какую-то централизованную систему диспетчеризации сообщений, которую некоторые классы будут отправлять событиям, а заинтересованные классы могут подключаться к прослушиванию определенных видов событий.
Но у меня есть некоторые вопросы. Во-первых, это кажется очевидной и распространенной проблемой. Есть ли любимые реализации простых систем обмена сообщениями в VM? Похоже, что было бы.
Во-вторых, и что более важно, я пытаюсь разработать достаточно элегантный способ для класса диспетчеризации как можно меньше узнать о типах сообщений. Я хотел бы иметь возможность создавать новые виды событий без изменения диспетчера сообщений. Однако у меня есть противоположная забота. Мне бы очень хотелось, чтобы подписи методов обработки были понятны. Другими словами, я бы предпочел следующее:
public class CollisionConsoleHandler implements CollisionListener {
@Override
public void spaceshipCollidedWithMeteor( Spaceship spaceship, Meteor meteor ) {
//...
}
}
над чем-то более общим и трудным для чтения:
public class CollisionConsoleHandler implements GameMessageListener {
@Override
public void handleMessage( GameMessage message ) {
if( message instanceof SpaceshipCollisionMessage ) {
Spaceship spaceship = ((SpaeshipCollisionMessage)message).getSpaceship();
Meteor meteor = ((SpaeshipCollisionMessage)message).getMeteor();
//...
}
}
}
Но я не вижу никаких хороших способов сохранить знание специфических типов из диспетчера, в то же время сохраняя чистоту и читаемость подписи метода.
Идеи?