шаблон проектирования команды

Шаблоны проектирования

Паттерн команды — это паттерн поведения.

Определение шаблонов команд

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

Command
командный режим

Шаблон команды может полностью разделить отправителя запроса и получателя. Между отправителем и получателем нет прямой связи. Объект, отправляющий запрос, должен знать только, как отправить запрос, а не как выполнить запрос.

Структура шаблона команды

Командный режим включает в себя следующие роли:

  • Роль получателя
    Режим приемника команд, здесь передается команда на выполнение соответствующей операции.

  • Командная роль
    Все команды, которые необходимо выполнить, объявлены здесь.

  • Роль вызывающего абонента
    Получить команду и выполнить команду, то есть инициатор и вызывающая сторона команды

Реализация шаблона команды

Абстрактный командный класс.

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, это громоздко.

Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер

微信公众号

Ссылаться на

  1. Шаблон команды шаблона проектирования Java
  2. Шаблон команды шаблонов проектирования --- Шаблон команды