Я ищу шаблон 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 (используемые службой внутри) и т.д..
Процесс обработки выглядит следующим образом:

Между получением каждого ответа и отправкой следующего запроса необходимо выполнить некоторую дополнительную обработку (например, на основе значений в любом из предыдущих запросов или ответов).
До сих пор я пробовал два подхода к кодированию этого в Java:
- анонимные классы: быстро становится уродливым из-за требуемой вложенности
- внутренние классы: более аккуратные, чем предыдущие, но все еще трудно для другого разработчика понять поток выполнения
Есть ли какой-нибудь шаблон, чтобы сделать этот код более удобочитаемым? Например, могу ли я выразить метод службы как список автономных операций, которые выполняются последовательно некоторым классом среды, который заботится о вложенности?