Рубрики
Без рубрики

Представляем re-agent: Java отмена/повтор и делегирование команд

Знакомство с библиотекой агентов путем ведения журнала. Библиотека Java, которая позволяет легко делегировать команды и отменять / повторять их с помощью этих команд. С пометкой “Показать разработчика”, “новички”, “с открытым исходным кодом”, “java”.

В качестве предисловия, это моя первая библиотека и, как ни странно, мой первый пост в блоге 😱 . Любая обратная связь будет очень признательна! Все должно с чего-то начинаться, верно?

Откладывая получение диплома, я понял, что мой последний проект содержал полезный код делегирования команд, который мог бы создать небольшую приятную библиотеку. Без лишних церемоний позвольте мне представить…

Для readme (он также находится ниже) и кода оформите заказ:

войти в систему/агент

Библиотека делегирования команд Java, предоставление функций отмены/повтора

Библиотека делегирования команд Java и отмены-повтора.

Особенности

  • Отменить и повторить
  • Слабо связанный Командный шаблон
  • Поддержка слушателей

Установка

Текущую версию выпуска можно найти в центральном репозитории maven. Чтобы использовать его, добавьте следующую зависимость в свой pom.xml :

com.logdynre-agent1.2

Релиз также можно найти на странице GitHub releases .

как использовать

Команды

Реализация интерфейса Command используется для запуска события в подписанном Исполнителе . Команды не определяют поведение выполнения, скорее они используются для запуска события и сбора любой информации, которая потребуется для этого события.

class ExampleCommand implements UndoableCommand {

    @Override
    public String getName() {
        return "Example Undoable Command";
    }
}

Есть также Отменяемая команда , которая может…

Эта библиотека начиналась как контроллер отмены/повтора для другого проекта и была адаптирована мной и моим программистом-криминалистом Мэтт в рамках нашей совместной работы на GitHub .

Продукт должен был выполнять три задачи:

  • Упростите делегирование команд
  • Упростите отмену/повтор
  • Будьте как можно более слабо связаны, насколько это возможно

Итак, что я подразумеваю под делегированием команд?

Допустим, у вас есть программа, которая открывает файл и предоставляет вам два разных окна редактора. Очевидно, что каждое окно редактора будет иметь свой собственный контроллер, но операции с файлами, скорее всего, могут быть разделены между ними. В нашем случае редакторам не особенно важно, как открывается файл, главное, чтобы их не забыли… редактор.заполнить(текст) сделает их хорошо.

Контроллер Меню файлов будет знать, когда вы хотите открыть файл, но мы хотим, чтобы наши редакторы тоже знали, но мы не обязательно хотим, чтобы контроллер знал о редакторах. Вот тут-то и вступает в дело наш делегатор команд.

Редакторы подпишутся на делегатора команд, заявив, что они хотят знать об определенных событиях, которые в данном случае являются Команда открытия файла . Когда файловый контроллер открывает файл, он публикует Команда открытия файла делегатору с любой информацией, необходимой для открытия файла. Делегат команды перешлет эту команду редакторам, и они будут беспокоиться о выполнении команды.

Та-да! Успешное делегирование 😄 но мы еще не закончили…

Отменить и повторить

Как знает любой, кто раньше внедрял систему отмены/повтора, возможно, самым сложным аспектом является возврат состояния. Чтобы иметь возможность отменить действие, вам нужны методы, которые действуют в режиме покоя (ведут себя одинаково независимо от состояния) или вам нужно сохранить состояние, в которое вы хотите вернуться.

Будучи великодушными разработчиками, какими мы являемся, мы решили, что нам все равно, и вы должны иметь возможность делать то, что хотите. Ура, свобода! В этом ключе процесс отмены/повтора использует четыре сущности: делегатор, издатель, команда и исполнитель. Команды могут содержать или не содержать состояние, но они всегда довольно тесно связаны со своим исполнителем

  • Делегатор: обрабатывает подписку исполнителя и передает вызовы для DO , отменить , и ПОВТОРИТЬ исполнителю команды
  • Издатель: все, что посылает команду делегатору
  • Команда: в основном пакет данных, может содержать служебные методы, которые будут использоваться исполнителем
  • Исполнитель: Управляет тем, как выполняются команды, с возможностью отмены и повтора.

Так как же мне его установить?

Просто добавьте его как зависимость от Maven! (Всегда блестящие Учебные пособия Дженкова вы рассмотрели)


  com.logdyn
  re-agent
  1.2

Так как же мне его использовать?

Я ленив, так что это прямо из readme, но я с нетерпением жду предложений по его улучшению 👍

Команды

Реализация интерфейса Command используется для запуска события в подписанном Исполнителе . Команды не определяют поведение выполнения, скорее они используются для запуска события и сбора любой информации, которая потребуется для этого события.

class ExampleCommand implements UndoableCommand {

    @Override
    public String getName() {
        return "Example Undoable Command";
    }
}

Есть также Отменяемая команда , которая может быть выполнена любым Исполнителем , хотя , если вы хотите использовать функцию отмены/повтора необходимо использовать Отменяемый исполнитель . По умолчанию метод повторно выполнить() вызывает выполнить() , хотя это может быть переопределено. Ан UndoableCommand должен предоставить данные, необходимые для отмены действия, а также для первоначального выполнения.

Исполнители

Реализация интерфейса Исполнитель используется для выполнения определенного поведения, когда Команда была опубликована.

class ExampleExecutor implements UndoableExecutor {
    @Override
    public void execute(ExampleCommand command) {
        System.out.println("Hello, World!");
    }

    @Override
    public void unexecute(ExampleCommand command) {
        System.out.println("Goodbye, World!");
    }

    @Override
    public void reexecute(ExampleCommand command) {
        System.out.println("Hello again, World!");
    }
}
Подписка на команду

Подписка на Команду требует, чтобы вы указали Исполнителя и Команду , которую он будет выполнять. Исполнитель будет выполнять тип Команда на него подписан, или любой подкласс этого Команда . В результате этого только один Исполнитель этого типа или подтипа Команды

CommandDelegator.getINSTANCE().subscribe(new ExampleExecutor(), ExampleCommand.class);
Публикация (Выполнение) команды

Публикация Команда так же проста, как и передача ее в метод publish() . Затем это вызовет метод execute() соответствующего класса Исполнитель . Вызов выполнить() будет в том же потоке, что и вызов опубликовать , это означает, что если вы хотите инициировать выполнение задачи в фоновом режиме, она должна быть опубликована в фоновом режиме.

Если опубликованная Команда не может быть отменена, она очистит текущую историю отмен. Аналогично, если вы отменили команду и опубликовали новую, история повторов будет удалена.

CommandDelegator.getINSTANCE().publish(new ExampleCommand());
Отменить и повторить

Отменить и повторить – это вызовы методов делегатора команд | . Это работает так же, как метод publish() , он вызовет неисполненный() или |/повторное выполнение() метод соответствующего Исполнителя класса.

CommandDelegator.getINSTANCE().undo();
CommandDelegator.getINSTANCE().redo();

Любые вопросы или предложения были бы полезны, либо здесь 💬 , в моем Твиттере, либо напишите мне по адресу jake@logdyn.com

Оригинал: “https://dev.to/jsjlewis96/introducing-re-agent-java-undoredo–command-delegation-56n3”