Java-шаблон для вложенных обратных вызовов?

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

public interface Request {} 

public interface Response {} 

public interface Callback<R extends Response> {
    void onSuccess(R response);
    void onError(Exception e);
}

Существуют различные парные реализации интерфейсов Requestи Response, а именно RequestA+ ResponseA. ] (предоставляется клиентом), RequestB+ ResponseB(используется внутри службы) и т. д.

Поток обработки выглядит следующим образом:

Sequence diagram showing nested callbacks.

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

До сих пор я пробовал два подхода к кодированию этого на Java:

  • анонимные классы: быстро становятся уродливыми из-за обязательной вложенности
  • внутренние классы: более аккуратные, чем выше, но все еще трудные для понимания другим разработчиком поток выполнения

Есть ли какой-то шаблон, чтобы сделать этот код более читабельным? Например, могу ли я выразить сервисный метод в виде списка автономных операций, последовательно выполняемых некоторым классом фреймворка, который заботится о вложенности?

42
задан Andrew Swan 22 May 2012 в 02:50
поделиться