Как построить собственный конвейер промежуточных операций в Java для серии вызовов API? - PullRequest
0 голосов
/ 14 февраля 2019

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

interface operation{

operation copy(Params ..);  //intermediate

operation convert(Params ..);  // intermediate

operation edit(Params ..); // intermediate

finalresult execute(); // terminal op

}

Теперь каждая из этих функций может влиять на другую, основываясь на последовательности, в которой создается конвейер.Мой высокоуровневый подход состоял бы в том, чтобы просто сохранить имя операции и параметры внутри отдельной реализации методов операции и использовать это для определения и оптимизации всего, что я хотел бы в методе execute.Я чувствую, что это плохая практика, поскольку технически я ничего не делаю внутри методов работы, и это больше похоже на шаблон строителя, хотя и не совсем так.Я хотел бы знать мысли о моем подходе.Есть ли лучший проект для построения рабочих конвейеров в java?

Извинения, если вопрос кажется расплывчатым, но я в основном ищу способ построить рабочий конвейер в java, в то время как мой подход рассматривается.

1 Ответ

0 голосов
/ 14 февраля 2019

Вам следует взглянуть на такой шаблон, как

EntityHandler.of(remoteApi, entity)
             .copy()
             .convert(...)
             .get();

public class EntityHandler {
    private final CurrentResult result = new CurrentResult();
    private final RemoteApi remoteApi;

    private EntityHandler(
          final RemoteApi remoteApi,
          final Entity entity) {
       this.remoteApi = remoteApi;
       this.result.setEntity(entity);
    }

    public EntityHandler copy() {
       this.result.setEntity(new Entity(entity)); // Copy constructor
       return this;
    }

    public EntityHandler convert(final EntityType type) {
       if (this.result.isErrored()) {
          throw new InvalidEntityException("...");
       }

       if (type == EntityType.PRIMARY) {
          this.result.setEntity(remoteApi.convertToSecondary(entity));
       } else {
          ...
       }

       return this:
    }

    public Entity get() {
       return result.getEntity();
    }

    public static EntityHandler of(
          final RemoteApi remoteApi, 
          final Entity entity) {
       return new EntityHandler(remoteApi, entity);
    }
}

Ключ заключается в том, чтобы поддерживать состояние неизменным и обеспечивать безопасность потоков в локализованных местах, например в CurrentResultв данном случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...