Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
 Аватар для Tyson Fury
2 / 2 / 2
Регистрация: 23.10.2016
Сообщений: 139

Использование и реализация паттерна "Команда"

19.02.2017, 23:46. Показов 5269. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот схема паттерна (скриншот).
Прицепи, все довольно просто: есть инициатор (Invoker), который хочет, что бы получатель (Receiver) что либо выполнил, а само выполнение инкапсулируется классом КонкретнаяКоманда.

1. А что если инициатор и получатель это один и тот же объект? Для таких действий шаблон Команда подходит?

Например: Пользователь ввел в 9 цифр и далее нажал на кнопку Shuffle. После чего эти цифры должны перемешаться.
То есть, происходит действие над данными внутри одного класса.
Либо еще пример: Пользователь ввел в 9 цифр и программа должна проверить их на корректность.

2. И вообще, насколько часто Вы используете паттерн Команда в своих приложениях (там где есть GUI).

Вообщем помогите разобраться, а то я запутался.
Миниатюры
Использование и реализация паттерна "Команда"  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.02.2017, 23:46
Ответы с готовыми решениями:

Реализация паттерна "Команда"
есть ли у кого реализация на с++ ? Нужны примеры реализации на с++.... На Си его можно реализовать?

Реализация паттерна Observer от Microsoft
Совершенно случайно, нашел что интерфейс для данного паттерна создали за нас. Может кому-то пригодится. Пример реализации наблюдателя ...

Реализация консольного меню с использованием паттерна "Команда"
Добрые день форумчанам)) Задачка нынче такова: "Камни. Определить иерархию драгоценных и полудрагоценных камней. Отобрать камни для...

50
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
21.02.2017, 19:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от actionpattern Посмотреть сообщение
и ради чего он применяется, по-Вашему мнению?
инкапсулирование запроса в виде объекта
0
Заблокирован
21.02.2017, 20:20
Цитата Сообщение от Shamil1 Посмотреть сообщение
инкапсулирование запроса в виде объекта
это что самоцель?
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
21.02.2017, 20:22
Ищите в гугле "инкапсулирование запроса в виде объекта".
0
Заблокирован
21.02.2017, 22:03
Цитата Сообщение от Shamil1 Посмотреть сообщение
Ищите в гугле "инкапсулирование запроса в виде объекта"
Нашел по этому запросу пример похожий на ваш.

http://flash2048.com/post/command

То что там автор называет "командой", на деле является контроллером, отвечающим за управление девайсом. Терминология явно неадекватна. Ну это ладно.
Какова цель создания этого контроллера? Нужно отделить девайс(например телевизор) от управления им?
Если так, то почему он в классе телевизор все равно лепит средства управления им?
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Tv
{
    public void TurnOn()
    {
        Console.WriteLine("Телевизор включен");
        State = State.On;
    }
    public void TurnOf()
    {
        Console.WriteLine("Телевизор выключен");
        State = State.Off;
    }
    public State State { get; set; }
}
Почему он не сует все управление в контроллер тогда?

Добавлено через 24 минуты
Shamil1, и вот еще что непонятно.
Насколько я понял, основная цель автора в том, что у него разные девайсы управляются с одного пульта. Но для этой цели не нужно создавать отдельные контроллеры, для этого достаточно единого интерфейса для всех девайсов. В чем тогда смысл всего этого? Почему автор считает, что данный "паттерн" нужен для его случая?
0
 Аватар для Tyson Fury
2 / 2 / 2
Регистрация: 23.10.2016
Сообщений: 139
22.02.2017, 00:36  [ТС]
Цитата Сообщение от actionpattern Посмотреть сообщение
То что там автор называет "командой", на деле является контроллером, отвечающим за управление девайсом.
Я конечно все понимаю, но во всех книгах и на всех ресурсах, именно та схема, скрин которой я запостил, и есть паттерн Команда.
Цитата Сообщение от actionpattern Посмотреть сообщение
Какова цель создания этого контроллера? Нужно отделить девайс(например телевизор) от управления им?
Если так, то почему он в классе телевизор все равно лепит средства управления им?
Вопрос не ко мне, это мне показывали пример кода.

Цитата Сообщение от actionpattern Посмотреть сообщение
Насколько я понял, основная цель автора в том, что у него разные девайсы управляются с одного пульта. Но для этой цели не нужно создавать отдельные контроллеры, для этого достаточно единого интерфейса для всех девайсов. В чем тогда смысл всего этого?
Что, что? =)))

Цитата Сообщение от actionpattern Посмотреть сообщение
Почему автор считает, что данный "паттерн" нужен для его случая?
Я как раз и спрашивал, нужен ли мне этот паттерн. Свою ситуацию, я описывал в первом посте.

Главная цель темы это понять: где и когда имеет смысл применять паттерн Команда.

Не по теме:

actionpattern, у Вас регистрация 21.02.2017 и ник прикольный=) Под эту тему учетку делали?))

0
Заблокирован
22.02.2017, 01:35
Tyson Fury, я когда про автора говорил, я имел в виду не Вас, а того, который по ссылке.

Цитата Сообщение от Tyson Fury Посмотреть сообщение
Что, что?
Вам что-то не понятно?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Tyson Fury Посмотреть сообщение
Под эту тему учетку делали?))
да:)

0
 Аватар для Tyson Fury
2 / 2 / 2
Регистрация: 23.10.2016
Сообщений: 139
22.02.2017, 02:44  [ТС]
Цитата Сообщение от actionpattern Посмотреть сообщение
Tyson Fury, я когда про автора говорил, я имел в виду не Вас, а того, который по ссылке.
Все, понял. Вышло недоразумение =).

К стати у того автора, пример почти списан с книги (Эрик Фримен, Элизабет Фримен - Паттерны проектирования (Head First O'Reilly) - 2011).
0
Эксперт .NET
 Аватар для Usaga
14343 / 9447 / 1359
Регистрация: 21.01.2016
Сообщений: 35,620
22.02.2017, 05:57
Цитата Сообщение от actionpattern Посмотреть сообщение
получатель содержит обработчик, поэтому, обработка команды -- это можно сказать его дело, и он же на нее реагирует конкретным образом
Я правильно понял, что вы видите данный паттерн как инкапсулированный запрос (объект с кучкой параметров) и отдельностоящий от него исполнитель запросов?

Лично я вижу этот паттерн и как набор параметров и как исполнитель в одном объекте (что мне кажется вполне разумным). Оттого могло пойти и недопонимание между нами.
0
Модератор
Эксперт функциональных языков программирования
3138 / 2286 / 469
Регистрация: 26.03.2015
Сообщений: 8,890
22.02.2017, 10:29
Цитата Сообщение от actionpattern Посмотреть сообщение
Нашел по этому запросу пример похожий на ваш.
Автор статьи по ссылке не придумывает никаких названий. Он использует готовый шаблон с существующим названием. Поэтому Ваши комментарии по поводу терминологии неуместны.
Насколько уместно для заданной в статье задачи использование именно этого шаблона к текущему топику не относится.
О применении шаблона в реальных задачах можно, например, почитать в википедии:
Кликните здесь для просмотра всего текста
Применение

Шаблон Команда может быть полезен в следующих случаях.

Кнопки пользовательского интерфейса и пункты меню

В Swing и Borland Delphi Action (действие) является объектом команды. В дополнение к способности выполнить нужную команду, Action может иметь связанную с ним иконку, сочетание клавиш, текст всплывающей подсказки и так далее. Кнопка на панели инструментов или пункт меню могут быть полностью инициализированы с использованием только объекта Action.

Запись макросов

Если все действия пользователя представлены в виде объектов команды, программа может записать последовательность действий, просто сохраняя список командных объектов в том порядке, в котором они выполняются. Затем она может «воспроизвести» одни и те же действия, выполняя те же объекты команд в той же последовательности.

Многоуровневая отмена операций (Undo)

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

Сети

Можно отправить объекты команд по сети для выполнения на другой машине, например действие игрока в компьютерной игре.

Индикаторы выполнения

Предположим, что программа имеет последовательность команд, которые она выполняет по порядку. Если каждый объект команды имеет метод getEstimatedDuration() (получить оценочную длительность), программа может легко оценить общую продолжительность процесса. Она может показать индикатор выполнения, который отражает, насколько близка программа к завершению всех задач.

Пулы потоков

Типичный класс пула потоков общего назначения может иметь метод addTask(), который добавляет рабочий элемент к внутренней очереди заданий ожидающих своего выполнения. Он поддерживает пул потоков, которые выполняют команды из очереди. Элементы в очереди являются объектами команд. Как правило, эти объекты реализуют общий интерфейс, такой как java.lang.Runnable, что позволяет пулу потоков запустить команды на выполнение, даже если он сам был написан без каких-либо знаний о конкретных задачах, для которых он будет использоваться.

Транзакции

Аналогично операции «отмена» система управления базами данных (СУБД) или установщик программного обеспечения может хранить список операций, которые были или будут выполнены. Если одна из них закончится неудачей, то все остальные могут быть отменены или быть отброшены (обычно называется откат). Например, если две связанные между собой таблицы базы данных должны быть обновлены, а второе обновление терпит неудачу, то транзакция может быть откачена, чтобы первая таблица не содержала недопустимую ссылку.

Мастера

Часто мастер (мастер установки или любой другой) представляет несколько страниц конфигурации для одного действия, которое происходит только тогда, когда пользователь нажимает на кнопку «Готово» на последней странице. В этих случаях, естественный способ отделить код пользовательского интерфейса от кода приложения является реализация мастера с помощью объекта команд. Объект команда создается при первом отображении мастера. Каждая страница мастера сохраняет свои изменения в объекте команды, поэтому объект заполняется по мере перехода пользователя. Кнопка «Готово» просто запускает метод execute() на выполнение.


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

Единый интерфейс для всех дивайсов у автора статьи есть - ICommand.
1
Заблокирован
22.02.2017, 18:23
Цитата Сообщение от Shamil1 Посмотреть сообщение
Насколько уместно для заданной в статье задачи использование именно этого шаблона к текущему топику не относится.
Ну как не относится? Шаблоны нужны для чего, вообще? для того, чтобы их применять в подходящих задачах. И для нас, что для ТСа, что для меня, единственно возможным объяснением смысла шаблона -- показать его на примере подходящей задачи, обосновать, почему этот шаблон подходит для данной задачи. И, желательно, в стиле: вот было вот так плохо, а теперь с шаблоном стало вот так вот хорошо.
А этовсе, что Ваши объяснения, что по ссылке, что в википедии -- это просто заклинания. Это все тему не раскрывает, по-моему.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
24.02.2017, 11:35
Вообще паттерн Команда очень полезен,
когда надо динамически формировать последовательность некоторых операций.
Создаем контейнер команд, закидываем туда объекты-команды в нужном порядке - и вперед!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.02.2017, 11:35
Помогаю со студенческими работами здесь

Какова роль Invoker паттерна Команда?
Ели посмотреть простейший пример реализации паттерна Команда (из метанита): abstract class Command { public abstract void...

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

Реализация паттерна Singleton
Добрый день. Необходимо реализовать класс Storage, объект которого будет единственным в программе. Для достижения данной цели было выбрано...

Реализация паттерна MVC
Доброго времени суток. Допустим у меня есть класс Database в котором 2 метода: class Database { public OleDbConnection...

Реализация паттерна состояние
Парни, кто шарит, помогите реализовать паттерн. "Игра перемещение по лабиринту". Как можно проще.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru