Как реализовать обратные вызовы в Java

У меня есть класс под названием CommunicationManager, который ответственен за связь с сервером.

Это включает методы login() и onLoginResponse(). В случае пользователя входят в метод login() должен быть назван и когда сервер отвечает метод onLoginResponse() выполняется.

То, что я хочу сделать, должно связать действия с пользовательским интерфейсом. В классе GUI я создал экземпляр названного CommunicationManager mCommunicationManager. От GUI классифицируют login() метод просто называет строка

mCommunicationManager.login();

То, что я не знаю, как сделать, связывает метод от класса GUI до onLoginResponse(). Например, если класс GUI включает метод notifyUser() который отображает сообщение, полученное от theserver.

Я был бы очень признателен за, если кто-либо мог бы показать, как связать методы для выполнения метода от класса GUI (напр. GUI.notifyUser()) когда экземпляр класса mCommunicationManager получает сообщение от сервера и метод CommunicationManager.onLoginResponse() выполняется.

Спасибо!

10
задан Parvin Gasimzade 24 August 2012 в 08:57
поделиться

4 ответа

Я вижу, что вы используете два шаблона. Один из них - шаблон публикации / подписки или наблюдателя , упомянутый Питом. Я думаю, что это, вероятно, то, что вы хотите, но, поскольку в вопросе упоминается привязка метода для последующего выполнения, я подумал, что должен упомянуть шаблон команды .

Шаблон команды в основном является временным решением для тот факт, что java не рассматривает методы (функции) как объекты первого класса, и поэтому их невозможно передать. Вместо этого вы создаете интерфейс, который можно передавать и который инкапсулирует необходимую информацию о том, как вызывать исходный метод.

Так, для вашего примера:

 interface Command {
     public void execute();
 }

, а затем вы передаете экземпляр этой команды при выполнении login () функция (не проверено, Я должен, вероятно, упомянуть, что, хотя это общее объяснение того, как это работает, в Java уже есть кое-что для этой цели, а именно ActionListener и связанные классы ( actionPerformed () в основном это execute () в Command ). В основном они предназначены для использования с классами AWT и / или Swing и, следовательно, имеют особенности, специфичные для этого варианта использования.

25
ответ дан 3 December 2019 в 15:06
поделиться

Идиома, используемая в Java для достижения поведения обратного вызова, - это Listeners. Создайте интерфейс с методами для нужных вам событий, имейте механизм для регистрации объекта слушателя с источником событий. Когда происходит событие, вызовите соответствующий метод для каждого зарегистрированного слушателя. Это общий шаблон для событий AWT и Swing; случайно выбранный пример см. в FocusListener и соответствующий объект FocusEvent .

Обратите внимание, что все события в Java AWT и Swing в конечном итоге наследуются от EventObject , и по соглашению вызывается прослушиватель SomethingListener и событие SomethingEvent . Хотя вы можете называть свой код как угодно, проще поддерживать код, который придерживается соглашений платформы.

3
ответ дан 3 December 2019 в 15:06
поделиться

Насколько мне известно, Java не поддерживает привязку методов или делегатов, как это делает C #.

Возможно, вам придется реализовать это через интерфейсы (например, как прослушиватель команд).

Возможно, вам будет полезен этот веб-сайт:

http://www.javaworld.com/javaworld/javatips/jw-javatip10. html

1
ответ дан 3 December 2019 в 15:06
поделиться

Вы можете посмотреть swt-сниппеты (посмотрите на слушателей)

http://www.eclipse.org/swt/snippets/

или вы используете класс runnable, перезаписывая метод run своим кодом обратного вызова при создании экземпляра

1
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: