Паттерн команды — это паттерн поведения.
Определение шаблонов команд
Шаблон команды — это очень связанный шаблон, который инкапсулирует запрос в объект, позволяя вам параметризовать клиента с помощью различных запросов, ставить в очередь или регистрировать запросы, а также предоставлять функции отзыва и восстановления команд. Ядром командного режима является введение класса команды, который уменьшает связь между отправителем и получателем.Отправителю запроса нужно только указать объект команды, а затем использовать объект команды для вызова метода обработки запроса. получатель.
Шаблон команды может полностью разделить отправителя запроса и получателя. Между отправителем и получателем нет прямой связи. Объект, отправляющий запрос, должен знать только, как отправить запрос, а не как выполнить запрос.
Структура шаблона команды
Командный режим включает в себя следующие роли:
-
Роль получателя
Режим приемника команд, здесь передается команда на выполнение соответствующей операции. -
Командная роль
Все команды, которые необходимо выполнить, объявлены здесь. -
Роль вызывающего абонента
Получить команду и выполнить команду, то есть инициатор и вызывающая сторона команды
Реализация шаблона команды
Абстрактный командный класс.
public abstract class Command {
public abstract void execute();
}
Вызывающий класс Invoker.
public class Invoker {
private Command command;
//构造注入
public Invoker(Command command) {
this.command = command;
}
//设值注入
public void setCommand(Command command) {
this.command = command;
}
//业务方法,用于调用命令类的execute()方法
public void call() {
command.execute();
}
}
Для конкретного класса Command установите соответствующий приемник.
public class ConcreteCommand extends Command {
private Receiver receiver; //维持一个对请求接收者对象的引用
public ConcreteCommand(Receiver receiver) {
super();
this.receiver = receiver;
}
public void execute() {
receiver.action(); //调用请求接收者的业务处理方法action()
}
}
Абстрактный приемник.
public abstract class Receiver {
public abstract void action();
}
первый получатель.
public class ConcreteReceiver extends Receiver{
@Override
public void action() {
System.out.println("ConcreteReceiver receives the command!");
}
}
второй получатель.
public class ConcreteReceiver2 extends Receiver{
@Override
public void action() {
System.out.println("ConcreteReceiver2 receives the command!");
}
}
Тестовый класс создает два приемника и отправляет команды соответственно.
public class Client {
public static void main(String[] args) {
Receiver receiver1 = new ConcreteReceiver();
Command command1 = new ConcreteCommand(receiver1);
Invoker invoker = new Invoker();
invoker.setCommand(command1);
invoker.call();
Receiver receiver2 = new ConcreteReceiver2();
Command command2 = new ConcreteCommand(receiver2);
invoker.setCommand(command2);
invoker.call();
}
}
Суммировать
Суть паттерна команды заключается в инкапсуляции запроса, одному запросу соответствует одна команда, а ответственность за выдачу команды и ответственность за выполнение команды разделены. Каждая команда является операцией: запрашивающая сторона выдает запрос на выполнение операции, принимающая сторона получает запрос и выполняет соответствующую операцию. Шаблон команды позволяет запрашивающей стороне и принимающей стороне быть независимыми, так что запрашивающей стороне не нужно знать интерфейс принимающей стороны, не говоря уже о том, как получен запрос, выполняется ли операция, когда она выполняется. , и как это выполняется. Ключом к шаблону команд является введение абстрактного класса команд.Отправитель запроса запрограммирован для абстрактного класса команд, и только конкретные команды, которые реализуют абстрактный класс команд, связаны с получателем запроса.
Преимущества командного режима:
-
Межклассовая развязка
Между ролью вызывающей стороны и ролью получателя нет никакой зависимости.Когда вызывающая сторона реализует функцию, ей нужно только вызвать метод выполнения абстрактного класса Command, и ему не нужно знать, какой получатель ее выполняет. -
Масштабируемость
Подклассы команд могут быть легко расширены без жесткой связи кода между вызывающим Invoker и высокоуровневым модулем Client.
Недостатком является то, что это приводит к расширению класса.Если есть несколько подкоманд, соответствующих нескольким подклассам Command, это громоздко.