Почему шаблон команд удобен в объектно-ориентированном проектировании? - PullRequest
14 голосов
/ 09 июня 2011

Я не понимаю, почему шаблон Command удобен в объектно-ориентированном проектировании.

Вместо использования, например, команда Switch, которая имеет ссылку на класс Lamp, не можетЯ просто создаю Switchable абстрактный класс и вызываю его методы?

Таким образом, в любом случае я разделяю вызывающего и получающего, и мне не нужно создавать объект Command для каждого получающего класса.

Ответы [ 8 ]

13 голосов
/ 09 июня 2011

Ваш Switchable создает абстракцию между invoker и получателем, но они все еще связаны (invoker требуется ссылка на получателя).Шаблон Command позволяет вам создать это разделение.Вызывающий говорит некоторому промежуточному компоненту: « Эй, у меня есть команда, которую я хотел бы выполнить », и затем промежуточная вещь может динамически передать этот запрос получателю.

ps ... Полагаю, вы взяли пример Switch из википедии.Это довольно плохой пример того, почему этот шаблон полезен.Взгляните на лучшие примеры .

9 голосов
/ 09 июня 2011

Предположим, вы хотите составить список, подобный этому:

  • Включить лампу
  • Установить температуру кондиционера
  • Спектакль "Лунная река"

Действия и получатели все разные, поэтому вам нужна абстракция, которая отделена от всех них. Шаблон Command также пригодится, если вы хотите отменить / повторить или подобные вещи.

7 голосов
/ 15 августа 2013

Давайте посмотрим на это так: когда клиент хочет, чтобы получатель выполнил какое-то задание, тогда у клиента есть две опции:

  1. Позвонить получателю и сказать ему, чтобы он выполнил задачу.
  2. Позвоните какой-нибудь третьей стороне, которая знает получателя, и третья сторона передаст сообщение получателю.

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

ИЛИ предположим, что вы потеряли пульт, и вам нужно перейти к телевизору и вручную переключить кнопку.

Это обеспечивает гибкость, позволяющую выполнять команды не только в синхронном режиме, но и в асинхронном режиме.

5 голосов
/ 08 октября 2015
You -> Switch -> Light

Здесь выключатель разъединяет вас и свет. Это облегчает включение / выключение света с помощью переключателя. это использование (удобство) при использовании шаблона команды.

Вы - Command Invoker
Коммутатор - Диспетчер команд
Команда - включить / выключить
Light - Фактический исполнитель

Если шаблон команд отсутствует, вы должны вручную поставить лампочку в держатель и при необходимости убрать ее.

1 голос
/ 15 апреля 2017

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

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

Например, реализация шаблона Command для простого текстаредактор ( GOF - глава 2) будет выглядеть следующим образом:

enter image description here

Сохраняя undoRedoPointer, мы можем достичьОперация отмены / возврата путем увеличения / уменьшения счетчика при каждом выполнении команды без нарушения инкапсуляции объекта.Это результат объединения команды и шаблона проектирования memento .

1 голос
/ 25 января 2016

Нет.Вы не можете сделать то же самое, что команда делает с абстракцией.Фактически, каждый раз, когда вы можете выполнять работу с шаблоном или чем-то еще, вы можете делать это другим способом.Но когда вы изменяете Switcher с конкретного на абстрактный, что вы должны сделать это для правильного дизайна независимо от шаблона команды, вы только отсоединяете клиента Switcher от его реализации и не отсоединяете Switcher (т.е. Invoker) от Lamp (т.е. Receiver)потому что, наконец, у вас должна быть ссылка на Lamp в бетонах Switcher, равная тому, чтобы иметь ее в Switcher.Обратите внимание, что лампа является бетоном, и вы не можете изменить его на абстрактный.Поэтому, когда у вас есть конкретный объект, и вы работаете с ним много раз и со многими другими атрибутами, вы должны использовать командный шаблон, чтобы отделить форму переключателя Lamp от перемещения зависимости Switcher от Lamp внутри класса Command и зависимого переключателя от промежуточного класса, т. Е. Command.Кроме того, я думаю, что пример в Википедии очень полезен.

0 голосов
/ 20 апреля 2019

Я полагаю, что с помощью шаблона команд несколько инициаторов могут использовать одну и ту же команду. Например, в случае редактора функция копирования (или алгоритм) должна вызываться из команды (ctrl + c) или из меню.

Так что, если бы вы не реализовали шаблон команды, функция копирования algo была бы тесно связана с командой ctrl + c, и вам было бы трудно повторно использовать ее для вызова из меню редактора.

Так это выглядит так ...

Действие Ctrl + C -> CopyCommand -> Copy algo

Команда копирования меню -> CopyCOmmand -> Копировать алгоритм

Как видно из приведенного выше, источник команды меняется, но назначение остается тем же (скопируйте алгоритм)

0 голосов
/ 04 января 2016

Думайте о каждом «командном» объекте как о живом объекте или задаче, которая знает, как выполнить что-то самостоятельно.Ваш призыватель - это просто очередь или список, который может

1) содержать все эти объекты команд и

2) выполнять их в порядке / порядке, которые вам нравятся.

Этомодель настолько гибкая с точки зрения обработчика, не так ли?При выполнении задач вызывающий может буферизовать, расставлять приоритеты или следовать любому алгоритму.

...