То, что вам нужно, называется «паттерн „Наблюдатель“». Сигналы в Qt — это всего лишь одна из реализаций данного паттерна.
Стандартным для Java способом реализации является такой:
1. Создается интерфейс для наблюдателя (слота в терминологии Qt) с нужными методами
2. Для наблюдаемого класса создаются методы подписки (connect в Qt), отказа от подписки и вызова.
Соглашение об именовании:
Допустим, сигнал называется Foo
Тогда интерфейс будет называться FooListener, у него будет метод foo
Метод подписки будет называться addFooListener, метод отписки — removeFooListener, метод вызова — fireFooListeners (последний должен быть protected).
Да, получается больше кода, чем в Qt. Но таково идеология Java