Обратный вызов / команда против шаблона EventListener / Observer

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

Callback pattern:

//example callback
public interface Callback{
    public void notify(MethodResult result);
}

//example method
public class Worker{
  public void doAsyncWork(Callback callback){
     //do work
     callback.notify(result);
  }
}

//example observer pattern
public interface EventListener{
   public void notify(MethodResult result);

}

public class Worker{
  private EventListener listener;
  public registerEventListener(EventListener listener){
   this.listener=listener;
  }
  public void doAsyncWork(){
     //do work
     listener.notify(result);
  }
}

Я работаю с фреймворком, который, кажется, использует оба этих шаблона. Шаблон EventListener не является типичным шаблоном, поскольку у него нет списка слушателей. Однако это можно легко реализовать, создав CompositeListener, который имеет свою собственную семантику приоритета слушателей и того, как обрабатывать распределение событий для каждого слушателя, например. создание нового потока для каждого слушателя и последовательных уведомлений. (На самом деле я думаю, что это хорошая идея, поскольку это хорошее разделение проблем и улучшение стандартного шаблона наблюдатель / слушатель).

Есть какие-нибудь мысли о том, когда следует использовать каждый из них?

Спасибо.

30
задан DD. 21 January 2012 в 06:52
поделиться

2 ответа

Оба шаблона имеют несколько общих намерений, за исключением того, что

Наблюдаемый шаблон может уведомить нескольких слушателей. С другой стороны, шаблон команды будет лучше всего подходить, где вам понадобится один обработчик обратного вызова.

В шаблоне команд легко реализовать операцию отмены.

Ура!

0
ответ дан 27 November 2019 в 23:45
поделиться
  • Обратный вызов: исполняемый код передал как аргумент функции, которая вызвана, когда определенный случай происходит. Это может быть реализовано в различных формах на различных языках программирования, таких как указатели функции, анонимные функции и слушатели/наблюдатели (объектно-ориентированная парадигма). Это часто обращается к единственному исполняемому коду, но это не требуется. Контрпример: интерфейс SurfaceHolder в Android SDK (Уровень API 29) позволяет регистрацию нескольких обратных вызовов с помощью addCallback () метод.
  • Слушатель/наблюдатель: в объектно-ориентированной парадигме это - объект с методом, который передается как аргумент функции, которая вызвана, когда определенный случай происходит. Это - одна возможная реализация нескольких обратных вызовов.
  • Шаблон "наблюдатель": объектно-ориентированный шаблон программного дизайна, который рекомендует использовать наблюдателя/слушателей для отделения класса наблюдателя от наблюдаемого класса.

В Вашем определенном коде, единственные различия между Обратным вызовом и EventListener:

  • Вы позволяете регистрировать только один Обратный вызов, но позволяете нескольким, регистрация EventListeners
  • Обратного вызова синхронизируется с выполнением асинхронной задачи, регистрация EventListener не.

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

шаблон разработки Команды является инкапсуляцией всей информации, должен был выполнить действие в объекте, и это, не имеет никакого отношения к механизму, используемому для уведомления событий.

0
ответ дан 27 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

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