Паттерны в разработке приложений. Поведенческие паттерны. Часть 1.
Published 4 февраля 2021 г. 11:46
Продолжаем наше знакомство с паттернами и на очереди у нас - Поведенческие паттерны. Это довольно обширная группа паттернов и рассказать о них в одном посте будет весьма проблематично, так что повесть о них растянется на пару постов :-). Поехали!
Для начала стоит узнать, что же такое поведенческие паттерны и зачем они нужны.
Поведенческие паттерны - это шаблоны, позволяющие организовать взаимодействие между классами и объектами с целью повышения эффективности данного взаимодействия. Всего таких паттернов 10:
- Цепочка обязанностей (Chain of Responsibility)
- Команда (Command)
- Итератор (Iterator)
- Посредник (Mediator)
- Снимок (Memento)
- Наблюдатель (Observer)
- Состояние (State)
- Стратегия (Strategy)
- Шаблонный метод (Template method)
- Посетитель (Visitor)
В этой статье узнаем подробнее о первой пятёрке.
Цепочка обязанностей
Представьте, что у вас есть платформа для онлайн-заказов. Есть администраторы, которые могут просматривать заказы клиентов и , естественно, сами клиенты. Вам необходимо определять пользователя (администратор или клиент), но ваша проверка состоит из многочисленных этапов. В итоге код превращается в нагромождение условных конструкций и поддерживать его становится очень трудно.
Здесь то нам и пригодится паттерн Цепочка обязанностей. Он позволит нам разделить этапы проверки между обработчиками. В случае прохождения этапа проверки, запрос передаётся следующему обработчику и так до конца цепочки. Если же на каком-то этапе обработка прервётся, то дальше проверка просто не пойдёт. Так мы сможем избежать множества условных конструкций в одном методе и в дальнейшем легко добавить дополнительные проверки, если таковые понадобятся. Здесь и здесь представлены ресурсы с кодом и диаграммами.
Команда
Данный шаблон будет полезен, когда вам необходимо отслеживать историю команд пользователя и поддерживать функцию отмены данных команд. Простой пример - редактор текста. В редакторе есть возможность выполнения и отмены команды с помощью пунктов меню или сочетания клавиш. Для каждой такой команды было бы проблематично писать отдельные классы обработки (отдельно для клавиатуры и отдельно для пунктов меню).
Паттерн Команда избавит нас от данного времяпровождения :-). Вместо создания многочисленных классов мы можем создать объект, который будет знать, кому отправлять данный запрос, и привязать объекты интерфейса к данному объекту-команде. Так наши пункты меню и сочетания клавиш отправляют свои запросы не напрямую к получателю, а через объект-команду, что позволяет нам уменьшить связность и добавляет возможность отмены команд с помощью логирования. И, конечно же, ресурсы с кодом: код1, код2 и код3.
Итератор
Паттерн Итератор позволяет производить обход элементов составных объектов различными способами.
С помощью паттерна Итератор мы можем вынести поведение обхода нашей коллекции в отдельный класс и задавать методы обхода динамически. Аналогично походу в магазин, вы знаете, какие отделы (элементы) вам нужно посетить, но способ перемещения между ними может отличаться. Ресурсы: код1 и код2.
Посредник
Посредник служит для уменьшения связанности между модулями программы путём перемещения связей между ними в один объект-посредник. Примеров из жизни можно найти превеликое множество: это диспетчер в аэропорту, мобильный оператор, риелтор и т. д. Все они выступают в качестве посредников.
Паттерн Посредник необходим, когда количество связей между объектами велико и запутанно и нам необходимо разрубить этот q гордиев узел q. Ресурсы с кодом: код1 и код2.
Снимок
И заключительный (для данного поста) паттерн - Снимок (или Хранитель). Пример его реализации - наш старый добрый редактор (текста, фото и т. д.). Благодаря данному паттерну мы можем сохранять предыдущие состояния объекта и, в случае необходимости, вернуться к ним. Как загрузить предыдущее сохранение в игре :-). По традиции, ресурсы с кодом: код1 и код2.
На этой интригующей ноте завершим этот пост и двинемся к новым (и весьма полезным) поведенческим паттернам, разобранным во второй части.
Похожие публикации
Паттерны в разработке приложений. Поведенческие паттерны. Часть 2.
Паттерны в разработке приложений. Структурные паттерны