JavaRush /Курсы /JSP & Servlets /Поведенческие паттерны

Поведенческие паттерны

JSP & Servlets
17 уровень , 0 лекция
Открыта

Iterator

Iterator — поведенческий шаблон проектирования. Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из агрегированных объектов.

Iterator

Например, такие элементы как дерево, связанный список, хеш-таблица и массив могут быть пролистаны (и модифицированы) с помощью объекта Итератор.

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

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

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

Command

Команда (Command) — поведенческий шаблон проектирования, используемый при объектно-ориентированном программировании, представляющий действие. Объект команды заключает в себе само действие и его параметры.

Команда (Command)

Чтобы вызывать какой-то метод, обычно нужны:

  • ссылка на объект
  • имя метода (ссылка на метод)
  • значения параметров метода
  • ссылка на контекст, который содержит используемые объекты

Все эти данные нужно упаковать в один объект — Команда (command).

Но и это еще не все: ведь команду должен кто-то выполнить. Так что в состав этого паттерна входят еще четыре сущности: команды (command), приёмник команд (receiver), вызывающий команды (invoker) и клиент (client).

Объект Command знает о приёмнике и вызывает метод приемника. Значения параметров приёмника сохраняются в команде. Вызывающий объект (invoker) знает, как выполнить команду и, возможно, делает учёт и запись выполненных команд. Вызывающий объект (invoker) ничего не знает о конкретной команде, он знает только об интерфейсе.

Оба объекта (вызывающий объект и несколько объектов команд) принадлежат объекту клиента (client). Клиент решает, какие команды выполнить и когда. Чтобы выполнить команду, он передает объект команды вызывающему объекту (invoker).

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

Использование вызывающего объекта (invoker) позволяет вести учёт выполненных команд без необходимости знать клиенту об этой модели учёта (такой учёт может пригодиться, например, для реализации отмены и повтора команд).

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

Observer

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

Наблюдатель (Observer)

Классы, на события которых другие классы подписываются, называются субъектами (Subjects), а подписывающиеся классы называются наблюдателями (Observers).

При реализации шаблона Наблюдатель обычно используются следующие классы:

  • Observable — интерфейс, определяющий методы для добавления, удаления и оповещения наблюдателей;
  • Observer — интерфейс, с помощью которого наблюдатель получает оповещение;
  • ConcreteObservable — конкретный класс, который реализует интерфейс Observable;
  • ConcreteObserver — конкретный класс, который реализует интерфейс Observer.

Шаблон Наблюдатель применяется в тех случаях, когда в системе:

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

Этот шаблон часто применяют в ситуациях, в которых отправителя сообщений не интересует, что делают получатели с предоставленной им информацией.

Visitor

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

Шаблон демонстрирует классический приём восстановления информации о потерянных типах, не прибегая к понижающему приведению типов при помощи двойной диспетчеризации.

Посетитель (Visitor)

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

Шаблон следует использовать, если:

  • имеются различные объекты разных классов с разными интерфейсами, но над ними нужно совершать операции, зависящие от конкретных классов;
  • над структурой необходимо выполнить различные усложняющие структуру операции;
  • часто добавляются новые операции над структурой.

Mediator

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

Посредник (Mediator)

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

Посредник определяет интерфейс для обмена информацией с объектами Коллеги, Конкретный посредник координирует действия объектов Коллеги.

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

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

Комментарии (15)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Вадим Уровень 106
6 ноября 2024
Пока очень сложно, процентов 50 понимаю Эти задачи не могу решать
Ольга Николенко Уровень 109 Expert
18 марта 2024
В задаче по паттерну Команда в тексте ошибки "no operation registered for '%'" - требуется значение представлять именно в кавычках ' '.
Gleb Уровень 48
5 марта 2023
Да, суха теория… Visitor, я бы сказал, - это расширение понятия «функциональный интерфейс», оборачивающий в объект какую-то операцию. Визитор – это тоже объект, инкапсулирующий в себя некоторую одну операцию, но выполняться она может не над объектом одного класса, а нас самыми разными объектами.
Антон Уровень 108 Expert
26 октября 2022
Задача на Visitor: в исходном задании все животные размещены в пакете creature, а в проверяемом решении - в пакете animals, и из-за этого получается несовместимый винегрет и вагон ошибок с фактическими и ожидаемыми валидатором пакетами
Fermi Arch Уровень 24
16 ноября 2022
где эти задачи? не вижу никаких задач в этом квесте
Misha Saharin Уровень 111 Expert
5 марта 2023
задачи доступны студенкам JavaRush
Илья Кирбижеков Уровень 41 Expert
12 октября 2022
ничего не понятно, но очень интересно
Алексей Уровень 91 Expert
9 сентября 2022
Очень сложным языком написано. Мне как новичку вообще не понятно, например, что это значит: "Шаблон демонстрирует классический приём восстановления информации о потерянных типах, не прибегая к понижающему приведению типов при помощи двойной диспетчеризации."
Dmytryi Shubchynskyi Уровень 111 Expert
4 января 2023
Дальше стало понятней?)
Алексей Уровень 91 Expert
4 января 2023
Не сильно
Gleb Уровень 48
5 марта 2023
Достаточно просто посмотреть примеры кода в Википедии. Сразу становится всё просто и ясно
Алексей Уровень 91 Expert
8 марта 2023
Зачем тогда нужна эта лекция, если все можно посмотреть в википедии?? Смысл моего поста в том что новичку, который проходит курс Java Rush, не понятно изложение.
jvatechs Уровень 111 Expert
28 июля 2023
С вашей логикой: нафига мне этот курс, если я могу все изучить в википедии/гугле?
Дмитрий Саргаев Уровень 76 Expert
20 октября 2023
Не совсем эта логика) Логика такая, что за это обучение ты заплатил денежку и ожидаешь, что тебе разжуют то, что написано в бесплатной википедии, а не наоборот)
Ольга Уровень 72 Expert
14 марта 2024
В универе разжевывают отлично! Можно спросить, что не понятно, разжуют еще раз конкретно для тебя) как раз за то,что заплатил денежку) И кстати,по сравнению с другими курсами,здесь цена мизерная! И реально учат, мне есть с чем сравнить.