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

Шаблон команд в Java

Введение Вы, скорее всего, уже знаете о поведенческих паттернах. поведенческий патт… Помечен java, шаблоном проектирования, шаблоном команд.

Скорее всего, вы уже знаете о поведенческих моделях. поведенческие паттерны – это проблемы, связанные с подключением объектов Java. Хотя существует около 12 шаблонов проектирования, относящихся к поведенческим шаблонам, шаблоны команд занимают особое место, поскольку они используются чаще, чем другие шаблоны. Мотивация, лежащая в основе дизайна заказа, заключается в том, чтобы отделить обоснование между командами и их потребителями.

Ключевой частью шаблона команды является инкапсуляция всех данных, связанных с командой, в одном объекте. Обычно это делается с помощью набора методов, их параметров и одного или нескольких объектов, которым принадлежат эти методы, вызываемых как Приемник . Таким образом, важный момент в развязке заключается в том, что если вам пришлось изменить какое-либо из этих значений, вам нужно изменить только один класс.

В классической версии реализация шаблона команд включает в себя пять шагов.

  • Интерфейс Команды : Обычно это объявляется только одним методом для выполнения команды.
  • Конкретная команда : Это операция с параметрами, которые передают вызов получателю; В классическом подходе команда вызывает только один или несколько методов получателя , а не выполняет бизнес-логику.
  • Получатель : особенно хорошо знает, как выполнить действие.
  • Вызывающий : запрашивает команду для выполнения запроса.
  • Клиент : создает объект ConcreteCommand и устанавливает Получателя .

Пример шаблона команды

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

public interface Command {
    void execute();
}

Теперь мы создадим два класса, которые будут реализовывать интерфейс Command . Эти конкретные классы инкапсулируют данные, необходимые команде для выполнения двух команд, Отопление Включено и Отопление выключено .

Первый. Нагрев по команде будет реализован интерфейс Команды .

public class HeatingOnCommand implements Command {

    private HeatingSystem heatingSystem;

    public HeatingOnCommand(HeatingSystem heatingSystem) {
        this.heatingSystem = heatingSystem;
    }

    @Override
    public void execute() {
        heatingSystem.heatOn();
    }
}

Далее команда Отключение нагрева будет реализовывать интерфейс Команды . Команда отключения нагрева в основном имеет тот же код, что и Нагрев По Команде есть.

public class HeatingOffCommand implements Command {

    private HeatingSystem heatingSystem;

    public HeatingOffCommand(HeatingSystem heatingSystem) {
        this.heatingSystem = heatingSystem;
    }

    @Override
    public void execute() {
        heatingSystem.heatOff();
    }
}

Далее мы создадим наш класс Приемник , который находится здесь Система отопления класс

public class HeatingSystem  {

    public void heatOn() {
        System.out.println("Turn on heat");
    }

    public void heatOff() {
        System.out.println("Turn off heat");
    }
}

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

Мы назовем класс invoker как Контроллер здесь.

public class Controller {

    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void executeCommand() {
        command.execute();
    }
}

Наконец, наш клиент или метод main будут использовать вызывающий для выполнения команды.

public class HomeHeatingSystemAutomation {

    public static void main(String[] args) {

        Controller controller = new Controller();
        HeatingSystem heatingSystem = new HeatingSystem();

        Command heatOn = new HeatingOnCommand(light);
        Command heatOff = new HeatingOffCommand(light);

        controller.setCommand(heatOn);
        controller.executeCommand();

        controller.setCommand(heatOff);
        controller.executeCommand();
    }
}

В принципе, в основном методе есть три важных шага.

  1. Создание объекта из класса invoker, который является Контроллером в нашем приложении.
  2. Создание объектов из команд, которые мы собираемся выполнить.
  3. Выполнение команд с использованием вызывающих устройств.

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

Дополнительные опции

Шаблон команды можно использовать вместе со следующими опциями:

  • добавление команд в очередь для их последующего выполнения;
  • поддержка операций отмены/повтора;
  • хранение истории команд;
  • сериализация команд для сохранения их на диске;

Эти параметры не являются существенными для шаблона, но часто используются на практике.

Вывод

Главное преимущество шаблона команд заключается в том, что он отделяет объект, вызывающий операцию, от объекта, который знает, как ее выполнить. Различные модификации этого шаблона можно использовать для ведения истории запросов, реализации функции отмены и создания макрокоманд. Однако приложение может усложниться, поскольку этот шаблон, как и в, добавляет еще один уровень абстракции.

Оригинал: “https://dev.to/rockey5520/the-command-pattern-in-java-3m71”