У меня есть пара классов, которые хотят передать друг другу некоторую информацию и перезвонить позже, используя эту информацию (шаблон обратного вызова).
В моем приложении этот механизм служит двум целям:
- Запланированное / отложенное выполнение
- асинхронное выполнение с использованием обмена сообщениями
Мои объекты в основном говорят друг другу "когда вы закончите делать X, перезвоните мне и скажите мне сделать Y с Z (потому что к тому времени я забуду об этом)" . Где X может просто ждать нужного времени, но также общаться с удаленным сервисом или вызывать локальную функцию.
Теперь, если бы в Java были указатели функций (или эквивалентные), я бы реализовал некоторый класс "Job", содержащий один плюс необходимые ему аргументы. Например, в PHP эта структура должна хранить имя класса, имя функции и массив аргументов. В C это был бы указатель на функцию, и мне пришлось бы указывать одинаковые номера и типы аргументов для всех вызовов.
В Java обычный подход состоит в том, чтобы иметь интерфейс, который реализован всеми классами, которые хотят вызываться, например:
public interface ICallable {
public void call_me(Object data);
}
Теперь это не будет работать для меня, потому что
- объекты, которые будут вызваны, могут иметь другой набор методов для вызова
- звонящий не тот, кто решает, какой вызов следует сделать
Может быть, моя проблема в том, что я пытаюсь создать общую структуру данных и вызывать процедуру для различных обратных вызовов, но в принципе мне кажется, что это имеет смысл.
Какой хороший шаблон проектирования подходит для этой ситуации в Java?