Есть ли шаблон проектирования, который имеет дело с механизмом обратного вызова? - PullRequest
25 голосов
/ 03 июня 2009

Есть ли шаблон проектирования, который имеет дело с механизмом обратного вызова?

Ответы [ 9 ]

22 голосов
/ 03 июня 2009

Это будет Шаблон наблюдателя - из Википедии

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

15 голосов
/ 04 июня 2009

Зависит от того, как используется обратный вызов.

Шаблоны дизайна - это все, что нужно для передачи ваших намерений.

Если вы намеревались зарегистрировать один или несколько обратных вызовов, и они могут быть вызваны как уведомление «в какой-то момент в будущем», вы говорите Обозреватель. Кроме того, фактический вызов обратного вызова в этом случае обычно является «необязательным» или инициируется на основе какого-либо стимула. (Обратные вызовы могут или не могут быть вызваны)

Если вы намеревались передать «что-то делать», и это делается в методе (или используется для «что-то делать» во время более позднего процесса), вы говорите о стратегии. Кроме того, обычно происходит фактический вызов.

Обратите внимание, что точно такой же код может быть любым - это действительно о том, как вы думаете о проблеме и как вы хотите, чтобы другие думали об этом.

8 голосов
/ 04 июня 2009

обратный вызов - это форма шаблон разработки стратегии

6 голосов
/ 04 июня 2009

Несколько. Проверьте http://people.bu.edu/azs/teaching/cs108/2006fall/callback_pattern.pdf, и следующие:

Наиболее подходящий будет зависеть от ситуации. Какой язык программирования вы хотите использовать и что именно вы хотите делать?

4 голосов
/ 04 июня 2009

Внешний полиморфизм - У объекта есть ссылка на другой объект и функция, которая вызывается для этого объекта. Его можно рассматривать как один тип, таким образом, вы можете смешивать и сопоставлять объекты и функции для вызова события. Делегаты являются примером такой схемы. Это скорее подход в стиле C #.

Шаблон наблюдателя - Вы используете интерфейс / базовый класс, который объект может реализовать, и зарегистрировать этот интерфейс для события. Больше подходов в стиле Java.

Проверьте ответ, который я разместил здесь, для решения C ++ для делегатов / внешнего полиморфизма: необработанный указатель на функцию из связанного метода

1 голос
/ 23 января 2016

Хорошим описанием шаблона является шаблон проектирования Service Callback . Это часть каталога шаблонов SOA, но описанный шаблон можно использовать с общими компонентами, которые не являются сервисами SOA.

Другим связанным шаблоном является Шаблон обратного адреса , описанный в классической книге "Шаблоны корпоративной интеграции" Хоупом и Вульфом.

Йозуттис также говорит об обратном вызове в своей книге "SOA на практике". Он называет это шаблоном обмена сообщениями запроса / обратного вызова .

1 голос
/ 10 июня 2009

Ваш вопрос очень общий, и самый общий ответ, который я могу придумать, - это использовать полиморфизм, когда у вас есть проблема, требующая обратного вызова.

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

Желательно ли использовать состояние, стратегию, схему наблюдателя или что-то совершенно другое, зависит от обстоятельств.

0 голосов
/ 13 июня 2009

Я также согласен с другими постерами о паттерне Observer. Он специально разработан для этой цели.

0 голосов
/ 04 июня 2009

Образец наблюдателя приходит на ум.

Один объект (подписчик) может привязываться к другому объекту (издателю). Когда издатель изменяется или обновляется, он может уведомить всех своих подписчиков.

В зависимости от того, какой язык вы используете, вы можете указать функцию, которая должна вызываться в уведомлениях.

http://en.wikipedia.org/wiki/Observer_pattern

Это хорошо описано в Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения [Банда четырех]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...