Всегда есть определенные интерфейсы между модулями. С точки зрения вызова методов, их можно разделить на три категории: синхронные вызовы, обратные вызовы и асинхронные вызовы. Следующее фокусируется на подробном объяснении механизма обратного вызова.
1. Обзор
Механизм обратного вызовов в Java является относительно распространенным механизмом, но он может использоваться меньше в вашей программе, и механизмы обратного вызова можно увидеть повсюду в некоторых крупных рамках. В этой статье используются некоторые конкретные примеры, чтобы медленно приблизиться к механизму обратного вызова Java.
2. обратный вызов
Так называемый обратный вызов: это означает вызов метода C в классе A в классе B, а затем вызов метод D в классе A в классе B в классе B. Этот метод D называется методом обратного вызова. Когда на самом деле его используют, будут разные формы обратного вызова, например, следующие.
2.1 Синхронные обратные вызовы
Здесь я предполагаю такую ситуацию.
Директор компании A B сказал своему подчиненному (руководителю проекта C), что он хочет сделать опрос, но C не нужно было делать это сам. Менеджер C можно попросить организовать, чтобы его программист D завершил его. Менеджер C нашел программиста D и сказал ему, что исследовательская задача будет выполнена сейчас. И сообщите менеджеру C результаты опроса. Если есть какие -либо проблемы, вы все равно должны продолжать. Поскольку здесь C просит D сделать что -то, D все еще должен сообщить результат с C после этого. Это модель обратного вызова. Ниже приведена общая диаграмма класса обратного вызова:
Сначала нам нужно иметь обратный интерфейс CallbackInterface
CallbackInterface.java
public interface callbackinterface {public boolean check (int result);} На заднем плане Programmer D хочет сообщить результаты с менеджером проекта C, поэтому менеджер проекта необходимо реализовать вышеуказанный интерфейс обратного вызова:
Manager.java
Менеджер открытого класса реализует CallbackInterface {Private Programmer Programmer = NULL; Public Manager (Programmer _Programmer) {this.programmer = _programmer; } / *** Используется для делегирования, выпущенного боссом* / public void construst () {Arangement (); } // Запланировать подчиненные для изучения работы Private void Arrange () {System.out.println («Менеджер организует работу для программиста»); Progrommer.study (Manager.this); System.out.println («Расписание работы для программиста было завершено, и менеджер пошел делать другие вещи»); } @Override public boolean check (int result) {if (result == 5) {return true; } вернуть false; }} Для программиста D ему нужно провести цитату от менеджера C, чтобы общаться с ним. Тем не менее, вот задача, которую директор B попросил менеджера C обнять. Другими словами, здесь также можно спросить других менеджеров, таких как менеджеры B1, B2 и т. Д. Поскольку менеджеры реализовали интерфейс обратного вызова, вы можете напрямую позволить программисту D удерживать этот интерфейс здесь. следующее:
Progrommer.java
Public Class Programmer {public void -исследование (обратный обратный вызов) {int result = 0; do {result ++; System.out.println («th» + result + «результат исследования»); } while (! callback.check (result)); System.out.println («Задача опроса заканчивается»); }} Это еще проще и яснее для директора, потому что это эквивалентно тестированию клиента:
Boss.java
Public Class Boss {public static void main (string [] args) {Manager Manager = New Manager (New Programmer ()); Manager.Entrust (); }} Результаты работы:
Менеджер организует работу для программиста. Результаты 1 -го исследования. Результаты 2 -го исследования. Результаты 3 -го исследования. Результаты 4 -го исследования. Результаты 5 -го исследования. 5 -е исследование. Работа по планированию для программиста была завершена. Менеджер сделал другие вещи.
2.2 Асинхронные обратные вызовы
Что касается примера выше, то ваш менеджер проекта не всегда может ждать результатов вашего исследования. Но после того, как вы передадите вам эту задачу, он проигнорирует ее. Он будет делать свое дело, вы будете делать свое дело. Следовательно, функция обратного вызова необходимо обрабатывать здесь асинхронно.
Итак, здесь нам нужно изменить код класса программиста и изменить его следующим образом:
Progrommer.java
Public Class Programmer {public Programmer () {} public void -исследование (обратный обратный вызов) {New StudyThread (обратный вызов) .Start (); } // --------------------------- Программист 正在做的工作 --------------------------- Классовый The Extends extends Thread {CallbackInterface Callback = null; Public StudyThread (CallbackInterface _callback) {callback = _callback; } @Override public void run () {int result = 0; do {result ++; System.out.println («th» + result + «результат исследования»); } while (! callback.check (result)); System.out.println («Задача опроса заканчивается»); }}}Результаты работы:
Менеджер планирует работу для программиста. Работа по программисту была завершена, и менеджер делает другие вещи.
Результаты результатов 1 -го исследования Результаты 2 -го исследования Результаты 3 -го исследования Результаты 4 -го исследования Результаты 5 -го исследования. Задача исследования закончилась
2.3 Закрытие и обратные вызовы
Закрытие - это вызываемый объект, который записывает некоторую информацию из прицела, в которой он был создан.
2.3.1 Нормальный звонок
Во -первых, мы видим, как выполняется звонок при нормальных обстоятельствах.
Incrementable.java
Интерфейс incrementable {void urgent ();}Это обычный интерфейс (это просто обычный интерфейс при обычных вызовах, и это интерфейс обратного вызова в обратном вызове, который должен быть легко понять).
Callee1.java
класс Callee1 реализует Incrementable {private int i = 0; @Override public void Increment () {i ++; System.out.println (i); }}Обратный вызов. Ява
Открытый класс Callbacks {public static void main (string [] args) {callee1 callee1 = new callee1 (); callee1.increment (); }}Callbacks - это тестовый класс клиента, нечего сказать, просто посмотрите на приведенный выше код.
2.3.2 Первоначальная пробная версия обратного вызова
О обычных вызовах выше нечего сказать, потому что для обычного программиста Java это должно быть чем -то, что можно сделать, не задумываясь.
Теперь, если вы хотите сформировать обратный вызов, невозможно иметь только одну Callee (объект обратного вызова Callee1) с точки зрения структуры или логики программы, и вам также нужен объект вызывающего абонента. Звонящий может написать это так:
Caller.java
Class Caller {Private Incrementable CallbackReference; Public Caller (Incrementable _callbackReference) {callbackReference = _callbackReference; } void go () {callbackReference.increment (); }} Здесь Caller сохраняет обратную пробку для интерфейса обратного вызова, точно так же, как упомянутый выше программист должен содержать ссылку на менеджер проекта, чтобы вы могли общаться с менеджером проекта посредством этой ссылки. CallbackReference здесь также играет эту роль.
Теперь давайте посмотрим на написание тестового класса:
Обратный вызов. Ява
Открытый класс Callbacks {public static void main (string [] args) {callee1 callee1 = new callee1 (); Caller Caller1 = новый Caller (Callee1); Caller1.go (); }}Для программного кода до сих пор мы можем полностью сравнить код выше, который менеджер проекта организует программистов для изучения технических проблем. Он имеет тот же эффект.
2.3.3 Закрытие обратного вызова
По сравнению с нормальными обратными вызовами ядро закрытия обратных вызовов естественным образом лежит в закрытии, то есть контроль над областью.
Теперь предположим, что пользователь (другой программист) настраивает класс MyIncrement и включает метод приращения. следующее:
класс myincrement {public void Increment () {System.out.println ("mycrement.increment"); } static void f (myIncrement urment) {urgent.increment (); }}Есть еще один класс Callee2, унаследованный от приведенного выше класса:
Class Callee2 расширяет myincrement {private int i = 0; public void Increment () {super.increment (); i ++; System.out.println (i); }}Очевидно, что если вы хотите вызвать метод Increment () здесь, он становится общим вызовом функции. Итак, здесь нам нужно изменить класс Callee2 выше. Цель модификации состоит в том, чтобы сделать класс Callee2 совместимым с методом Increment () класса MyIncrement и методом Increment () Incrementable. После модификации:
Class Callee2 расширяет myincrement {private int i = 0; public void Increment () {super.increment (); i ++; System.out.println (i); } закрытие частного класса реализует Incrementable {@Override public void Increment () {callee2.This.increment (); }} Incrementable getCallbackReference () {return new urlure (); }} Обратите внимание, что класс закрытия здесь является частным классом, который является элементом закрытия. Поскольку класс закрытия является частным, должен быть открытый интерфейс для операций на объектах закрытия. Это метод GetCallbackReference () выше. Класс абонента не изменился.
Для тестирования клиентов, просто посмотрите на код:
открытый класс обратные вызовы {public static void main (string [] args) {callee2 callee2 = new callee2 (); Caller Caller2 = новый Caller (callee2.getCallbackReference ()); caller2.go (); }}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.