Смущенный о Командном Образце - PullRequest
3 голосов
/ 23 марта 2011

В настоящее время я прохожу курс по дизайну программного обеспечения.Я сам никогда не был действительно хорош в разработке программных систем, поэтому я подумал, что это был разумный шаг, чтобы исправить мою слабость;)

Я пытаюсь понять, как работает шаблон команды.Я искал примеры, но все еще озадачен.Каковы обязанности каждого класса в шаблоне?Выполняют ли ConcreteCommands какое-либо действие или они несут необходимую информацию и отправляют ее в соответствующий пункт назначения для фактического выполнения?

Ответы [ 4 ]

4 голосов
/ 23 марта 2011

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

В этом случае вы Клиент . Документ представляет собой ConcreteCommand . Приемник - это объект, который вы упомянули в статье. И Invoker ваш друг.

Вы выбираете условия, при которых конверт будет открыт, выбирая Invoker .

1 голос
/ 24 марта 2011

Существует два различных варианта шаблона команд, которые я видел.

Первый - это простой интерфейс, используемый для выполнения задачи или команды.Интерфейс Runnable Java является одним из таких примеров.Реализации имеют простой метод, такой как doSomething (), который позволяет этой задаче или команде выполняться другим компонентом в системе.

Учебная версия шаблона Command заходит так далеко, что описывает другие компоненты.системы, которая будет использовать конкретную реализацию Command.Отсюда и другие термины, такие как Invoker, Receiver и Client.Обратитесь к Википедии для получения дополнительной информации по этому вопросу: http://en.wikipedia.org/wiki/Command_pattern

Не позволяйте этому шаблону проектирования сбить вас с толку, так же просто, как иметь интерфейс с определением "doSomething ()".

0 голосов
/ 24 марта 2011

Говоря с научной точки зрения, шаблон Command - это OO-реализация замыканий из функционального программирования, и его следует использовать соответствующим образом.

Предположим, у вас есть управление кнопками: при его нажатии необходимо выполнить какое-то действие.Это действие - это ConcreteCommand.Это может быть простой указатель на функцию (в C или C ++).Но если ему нужна дополнительная информация, например, от других элементов управления или пользовательского ввода, они также должны быть где-то захвачены.По этой причине удобно иметь объект, который будет захватывать эту дополнительную информацию.

В качестве побочного эффекта вы можете хранить команды в некотором контейнере и задерживать их выполнение, или вы можете отслеживать, какие команды выполнялись,или вы можете откатить их позже и т. д.

0 голосов
/ 23 марта 2011

Насколько я понимаю, суть шаблона Command заключается в сборе данных для выполняемого действия (чтобы оно могло быть выполнено в соответствующее время, а не сразу). Теперь, кто выполняет это действие, не так важно. Это может быть отдельный класс обработчика команд или сам класс команд.

...