Я пытаюсь разработать асинхронный фреймворк и хотел узнать, что люди думают о плюсах и минусах шаблона обратного вызова по сравнению с шаблоном наблюдателя.
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, который имеет свою собственную семантику приоритета слушателей и того, как обрабатывать распределение событий для каждого слушателя, например. создание нового потока для каждого слушателя и последовательных уведомлений. (На самом деле я думаю, что это хорошая идея, поскольку это хорошее разделение проблем и улучшение стандартного шаблона наблюдатель / слушатель).
Есть какие-нибудь мысли о том, когда следует использовать каждый из них?
Спасибо.
Оба шаблона имеют несколько общих намерений, за исключением того, что
Наблюдаемый шаблон может уведомить нескольких слушателей. С другой стороны, шаблон команды будет лучше всего подходить, где вам понадобится один обработчик обратного вызова.
В шаблоне команд легко реализовать операцию отмены.
Ура!
В Вашем определенном коде, единственные различия между Обратным вызовом и EventListener:
Первый более прост, последний более гибок. Если Вы создаете допускающую повторное использование платформу, последний имеет больше смысла.
шаблон разработки Команды является инкапсуляцией всей информации, должен был выполнить действие в объекте, и это, не имеет никакого отношения к механизму, используемому для уведомления событий.