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

Введение
назначение
Инкапсулировать запрос как объект, позволяя пользователям параметризовать клиентов различными запросами.
Основные решаемые проблемы
- Решает проблему сильной связанности между отправителями запросов и исполнителями в программных системах, особенно в сценариях, где действия необходимо записывать, отменять/повторять или обрабатывать в рамках транзакций.
Сценарий использования
- Когда поведение нужно записывать, отменять/повторять или обрабатывать транзакционно, используйте паттерн «Команда», чтобы разъединить запрашивающие стороны и исполнителей.
Подход к реализации
- Определите интерфейс команды: Интерфейс, который должны реализовывать все команды.
- Создайте конкретные команды: Конкретные классы, реализующие интерфейс команды и содержащие методы выполнения запросов.
- Вызывающий: Хранит объекты команд и запускает выполнение команд.
- получатель: Объект, который фактически выполняет команду.
Ключевой код
- Получатель: Фактический объект, который выполняет команду.
- Команда: Интерфейс, определяющий выполнение команды.
- Инициатор: Точка входа для использования объектов команд.
Пример приложения
- Struts 1ActionServlet выступает в роли инициатора, а классы слоя модели — в роли конкретных команд.
Преимущества
- Снижение связанности: Связанность между инициаторами запросов и исполнителями снижается.
- Простота расширения: Новые команды можно легко добавлять в систему.
Недостатки
- Слишком много классов команд: В системе может быть слишком много конкретных классов команд, что увеличивает сложность системы.
Рекомендации по использованию
- В графическом интерфейсе каждую кнопку или пункт меню можно рассматривать как команду.
- Используйте паттерн «Команда» в сценариях, где необходимо имитировать операции командной строки.
Примечания
- Если системе необходимо поддерживать операции отмены и повтора команд, паттерн «Команда» — подходящий выбор.
Структура
В основном он включает следующие ключевые роли:
Команда:
- Определяет интерфейс для выполнения операций, обычно содержащий
executeМетод, используемый для вызова конкретных операций.
- Определяет интерфейс для выполнения операций, обычно содержащий
ConcreteCommand:
- Реализует интерфейс команды и отвечает за выполнение конкретных операций. Обычно содержит ссылку на получателя и выполняет обработку запроса, вызывая методы получателя.
Receiver:
- Знает, как выполнять операции, связанные с запросом; объект, который фактически выполняет команду.
Invoker:
- Объект, который отправляет команды; он содержит объект команды и может запускать выполнение команды. Инициатор не обрабатывает запросы напрямую, а вместо этого реализует это, передавая запрос объекту команды.
Клиент:
- Создайте объекты конкретных команд и задайте их получателей, передавая объекты команд инициатору для выполнения.
Реализация
Сначала мы создаём интерфейс как командуOrder, затем создаём запросStockкласс. Конкретный класс командыBuyStockиSellStock, реализуетOrderинтерфейс, который будет выполнять фактическую обработку команды. Создайте класс в качестве вызывающего объекта.Broker, который принимает заказ и может разместить заказ.
BrokerОбъекты используют паттерн «Команда», определяя, какой объект выполняет какую команду в зависимости от типа команды.CommandPatternDemoИспользование классаBrokerкласс для демонстрации паттерна «Команда».
Шаг 1
Создайте интерфейс команды.
Order.java
Шаг 2
Создайте класс запроса.
Stock.java
Шаг 3
Создайте реализациюOrderКонкретный класс реализации интерфейса.
BuyStock.java
SellStock.java
Шаг 4
Создайте класс инициатора команд.
Broker.java
Шаг 5
Используйте класс Broker для приема и выполнения команд.
CommandPatternDemo.java
Шаг 6
Запустите программу, выведите результат:
Stock [ Name: ABC, Quantity: 10 ] bought Stock [ Name: ABC, Quantity: 10 ] soldДругие расширения