Шаблон проектирования: Команда Паттерн, который как правило упоминают в контексте разделения логики представления и бизнес логики. Типичные кейсы: ⁃ В GUI интерфейсе есть разные способы сделать одно и тоже, например копирование текста (контекстное меню, комбинация клавиш, кнопка и т.п.). Очень много подобных вещей в гугл документах, например, для создания файлов, выделения и других операций. ⁃ В бекенде тоже есть представление, это вьюхи, которые формируются контроллерами, это api или cli интерфейс. Во всех этих местах вызываются какие-то бизнесовые сценарии и они легко могут повторяться. Идея паттерна в том, что давайте не будем зашивать логику в то место, где оно используется, например в кнопку, а сделаем механизм, который позволит отделить саму кнопку, от того поведения, которое произойдет при ее нажатии. Соответственно у нас получается инверсия зависимости, сама по себе кнопка не делает ничего, она только передает управление, той команде, которой ее сконфигурировали. Так мы можем гибко менять поведение разных элементов интерфейса не создавая новые элементы на каждый чих, с другой стороны, мы можем одну и ту же операцию вызывать в разных местах без дублирования кода. В случае Java это объект-команда. var button = new Button(); // У команды есть один интерфейсный метод execute() var command = new CopyCommand(); button.setCommand(copy); // Кнопка добавляется в интерфейс В случае JS это обычная анонимная функция, которая вешается на событие. Собственно сам механизм реакции на события это и есть реализация паттерна команда. const button = document.getElementById('myButton'); // Adding a click event listener to the button button.addEventListener('click',() => { // Тут может быть напрямую зашитая логика // Если логика повторяется, то она может быть вынесена куда-то, // а здесь только вызов }); Если посмотреть описание этого паттерна, то видно, что оно довольно сильно заточено под классовые языки. Там как преимущество говорится о том, что если сделать команду объектом, то ее можно использовать как данные, передавать куда-то, записывать и так далее. В языках где все нормально с функциями высшего порядка, такой проблемы нет. Поэтому и паттерн команда там реализуется настолько просто, что даже возникает вопрос “для этого нужен паттерн?”. Но по смыслу команда там есть, даже если код очень простой. Чаще всего команда встречается в библиотеках и фреймворках и мы настолько привыкли к этому паттерну (особенно фротендеры и мобильщики), что даже не замечаем этого, считая команду чем-то само собой разумеющимся. Однако, когда доходит дело до написания своих библиотек, без четкого представления о том как устроен этот паттерн, могут происходить затупы, приводящие к херовым решениям. Но теперь вы знаете) Кстати проверка на хорошее понимание ооп: Если вы видите, что команда это просто частный случай реализации полиморфизма подтипов (subtyping), то у вас отличный уровень владения предметом. Если нет, то по ооп нужно подкачать базу и мы этим займемся тоже p.s. Вам приходилось реализовывать команду в своей практике?
1 год назад
Команда C#
Описание Архитектурный паттерн Command представляет собой поведенческий шаблон, который превращает запрос в объект, позволяя параметризацию клиентов с различными запросами, очередь запросов и поддержку операций, которые можно отменить. Этот шаблон инкапсулирует запрос как объект, позволяя разделять отправителя и получателя. Команды могут быть параметризованы, что означает, что вы можете создавать различные команды с разными параметрами без изменения вызывающего объекта (отвечающего за инициацию выполнения команды)...