Шаблон команды

Паттерн Команда — это управляемый данными шаблон проектирования, который относится к поведенческим шаблонам.

Паттерн Команда инкапсулирует запрос как объект, позволяя параметризовать клиентов различными запросами, ставить запросы в очередь или логировать их, а также поддерживать отменяемые операции.

Структурная схема паттерна Команда:

Введение

назначение

Инкапсулировать запрос как объект, позволяя пользователям параметризовать клиентов различными запросами.

Основные решаемые проблемы

  • Решает проблему сильной связанности между отправителями запросов и исполнителями в программных системах, особенно в сценариях, где действия необходимо записывать, отменять/повторять или обрабатывать в рамках транзакций.

Сценарий использования

  • Когда поведение нужно записывать, отменять/повторять или обрабатывать транзакционно, используйте паттерн «Команда», чтобы разъединить запрашивающие стороны и исполнителей.

Подход к реализации

  • Определите интерфейс команды: Интерфейс, который должны реализовывать все команды.
  • Создайте конкретные команды: Конкретные классы, реализующие интерфейс команды и содержащие методы выполнения запросов.
  • Вызывающий: Хранит объекты команд и запускает выполнение команд.
  • получатель: Объект, который фактически выполняет команду.

Ключевой код

  • Получатель: Фактический объект, который выполняет команду.
  • Команда: Интерфейс, определяющий выполнение команды.
  • Инициатор: Точка входа для использования объектов команд.

Пример приложения

  • Struts 1ActionServlet выступает в роли инициатора, а классы слоя модели — в роли конкретных команд.

Преимущества

  1. Снижение связанности: Связанность между инициаторами запросов и исполнителями снижается.
  2. Простота расширения: Новые команды можно легко добавлять в систему.

Недостатки

  • Слишком много классов команд: В системе может быть слишком много конкретных классов команд, что увеличивает сложность системы.

Рекомендации по использованию

  • В графическом интерфейсе каждую кнопку или пункт меню можно рассматривать как команду.
  • Используйте паттерн «Команда» в сценариях, где необходимо имитировать операции командной строки.

Примечания

  • Если системе необходимо поддерживать операции отмены и повтора команд, паттерн «Команда» — подходящий выбор.

Структура

В основном он включает следующие ключевые роли:

  • Команда:

    • Определяет интерфейс для выполнения операций, обычно содержащийexecuteМетод, используемый для вызова конкретных операций.
  • ConcreteCommand:

    • Реализует интерфейс команды и отвечает за выполнение конкретных операций. Обычно содержит ссылку на получателя и выполняет обработку запроса, вызывая методы получателя.
  • Receiver:

    • Знает, как выполнять операции, связанные с запросом; объект, который фактически выполняет команду.
  • Invoker:

    • Объект, который отправляет команды; он содержит объект команды и может запускать выполнение команды. Инициатор не обрабатывает запросы напрямую, а вместо этого реализует это, передавая запрос объекту команды.
  • Клиент:

    • Создайте объекты конкретных команд и задайте их получателей, передавая объекты команд инициатору для выполнения.

Реализация

Сначала мы создаём интерфейс как командуOrder, затем создаём запросStockкласс. Конкретный класс командыBuyStockиSellStock, реализуетOrderинтерфейс, который будет выполнять фактическую обработку команды. Создайте класс в качестве вызывающего объекта.Broker, который принимает заказ и может разместить заказ.

BrokerОбъекты используют паттерн «Команда», определяя, какой объект выполняет какую команду в зависимости от типа команды.CommandPatternDemoИспользование классаBrokerкласс для демонстрации паттерна «Команда».

Шаг 1

Создайте интерфейс команды.

Order.java

public interface Order { void execute(); }

Шаг 2

Создайте класс запроса.

Stock.java

public class Stock { private String name = "ABC"; private int quantity = 10; public void buy(){ System.out.println("Акция [ Название: "+name+", Количество: " + quantity +" ] куплена"); } public void sell(){ System.out.println("Акция [ Название: "+name+", Количество: " + quantity +" ] продана"); } }

Шаг 3

Создайте реализациюOrderКонкретный класс реализации интерфейса.

BuyStock.java

public class BuyStock implements Order { private Stock abcStock; public BuyStock(Stock abcStock){ this.abcStock = abcStock; } public void execute() { abcStock.buy(); } }

SellStock.java

public class SellStock implements Order { private Stock abcStock; public SellStock(Stock abcStock){ this.abcStock = abcStock; } public void execute() { abcStock.sell(); } }

Шаг 4

Создайте класс инициатора команд.

Broker.java

import java.util.ArrayList; import java.util.List; public class Broker { private List<Order> orderList = new ArrayList<Order>(); public void takeOrder(Order order){ orderList.add(order); } public void placeOrders(){ for (Order order : orderList) { order.execute(); } orderList.clear(); } }

Шаг 5

Используйте класс Broker для приема и выполнения команд.

CommandPatternDemo.java

public class CommandPatternDemo { public static void main(String[] args) { Stock abcStock = new Stock(); BuyStock buyStockOrder = new BuyStock(abcStock); SellStock sellStockOrder = new SellStock(abcStock); Broker broker = new Broker(); broker.takeOrder(buyStockOrder); broker.takeOrder(sellStockOrder); broker.placeOrders(); } }

Шаг 6

Запустите программу, выведите результат:

Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold
Другие расширения