Оба шаблона хороши, и какой из них выбрать, зависит от того, что вы собираетесь построить и как будет использоваться ваша инфраструктура.
Если вы пытаетесь создать какую-то систему публикации-подписки со следующим типичным потоком работы:
- клиент запускает асинхронную задачу и забывает о ней
- несколько обработчиков получают уведомления о завершении задачи
тогда Observer
модель - это естественный выбор для вас. Когда вы создаете фреймворк, вам также следует рассмотреть возможность использования шаблона EventBus для достижения слабой связи.
Если вам не нужно ничего больше, чем простое асинхронное выполнение и типичное использование потока вашей среды:
- запуск асинхронной задачи
- сделать что-нибудь, когда это будет завершено
или
- запустить асинхронную задачу
- сделать что-то
- дождитесь завершения и сделайте что-нибудь
тогда вы должны пойти с простым Callback
.
Но для того, чтобы получить более удобный и чистый API, я бы порекомендовал вам избавиться от Callback
абстракции и спроектировать ваш рабочий код так, чтобы он возвращал какой-то Future
.
public interface Worker<T> {
Future<T> doAsync();
}
А Worker
можно использовать следующим образом:
Future<Integer> future = worker.doAsync();
// some work here
Integer result = future.get(); // waits till async work is done
Future
может быть стандартным Java Future . Но я бы посоветовал вам использовать ListenableFuture
из библиотеки гуавы.