Я работаю над небольшой игрой Java, в которой могут произойти всевозможные события. Есть, по крайней мере, несколько десятков основных событий, которые могут быть заинтересованы различными обработчиками событий. В коде, где эти события могут быть запущены, также есть несколько мест. Вместо того, чтобы заставлять слушателей событий знать, к какому классу они должны зарегистрироваться, я бы хотел создать какую-то централизованную систему диспетчеризации сообщений, которую некоторые классы будут отправлять событиям, а заинтересованные классы могут подключаться к прослушиванию определенных видов событий.Простая система диспетчеризации сообщений 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();
//...
}
}
}
Но я не вижу каких-либо хороших способов, чтобы сохранить знания типоспецифической из диспетчера, в то же время сохраняя чистоту и удобочитаемость подписи метода.
Идеи?
Поскольку этот вопрос пришел и ушел несколько лет назад, у google guava есть диспетчер событий EventBus –