Скорее всего, вы уже знаете о поведенческих моделях. поведенческие паттерны – это проблемы, связанные с подключением объектов 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();
}
}
В принципе, в основном методе есть три важных шага.
- Создание объекта из класса invoker, который является
Контроллеромв нашем приложении. - Создание объектов из команд, которые мы собираемся выполнить.
- Выполнение команд с использованием вызывающих устройств.
Могут быть и другие шаги, необходимые для поддержки этих трех основных шагов. Например, этот метод main() создал объект Система отопления , потому что для передачи объекта Система отопления требуется создать Команду объекты. Когда вы выполните этот код, будет выдан следующий вывод.
Дополнительные опции
Шаблон команды можно использовать вместе со следующими опциями:
- добавление команд в очередь для их последующего выполнения;
- поддержка операций отмены/повтора;
- хранение истории команд;
- сериализация команд для сохранения их на диске;
Эти параметры не являются существенными для шаблона, но часто используются на практике.
Вывод
Главное преимущество шаблона команд заключается в том, что он отделяет объект, вызывающий операцию, от объекта, который знает, как ее выполнить. Различные модификации этого шаблона можно использовать для ведения истории запросов, реализации функции отмены и создания макрокоманд. Однако приложение может усложниться, поскольку этот шаблон, как и в, добавляет еще один уровень абстракции.
Оригинал: “https://dev.to/rockey5520/the-command-pattern-in-java-3m71”