Шаблоны проектирования по-человечески: поведенческие паттерны в примерах

4
20645
Добавить в избранное

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

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

Главной проблемой чтения чужого кода могут быть паттерны. Но даже если вы работаете с исконно своим проектом, наша подборка облегчит вашу жизнь. Возьмите на карандаш 😉

Характеристика

Данные шаблоны проектирования определяют способы и алгоритмы реализации совместной работы различных классов и объектов. Поведенческие паттерны уровня класса используют механизм наследования, а шаблоны уровня объекта – механизм композиции. Соседствующие объекты «знают» друг о друге, и важно то, как именно реализована эта связь.

Поведенческие паттерны: классификация

Они делятся на:

  1. Chain of Responsibility
  2. Command
  3. Iterator
  4. Mediator
  5. Memento
  6. Observer
  7. Visitor
  8. Strategy
  9. State
  10. Template Method

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

1. Паттерн Chain of Responsibility

Предположим, вы хотите оплатить покупку в Интернете. Всего есть 3 способа оплаты: A, B и C. Каждый из них располагает суммами в $100, $300 и $1000 соответственно, а приоритетность способов снижается от A к C. Вы хотите приобрести товар стоимость $210. Сперва будет проверен баланс A. Если нет достаточной суммы, запрос перемещается к балансу B, и так далее, пока не будет найдена необходимая сумма. Именно так работают поведенческие паттерны Цепочка Обязанностей, где A, B и C – звенья.

Итак, у нас есть базовая учетная запись, в которой объединены дополнительные учетные записи:

Теперь просто подготовим цепь, используя банковский счет, Paypal и Bitcoin:

2. Паттерн Команда

Заказ еды в ресторане: вы (Client) попросите официанта (Invoker) принести еду (Command), а официант отправит этот запрос шеф-повару (Receiver).  Другой пример для паттерна Command: вы (Client) включаете (Command) телевизор (Receiver) с помощью пульта (Invoker).

Прежде всего, у нас есть получатель (Receiver), который выполняет определенные действия:

Есть интерфейс реализации команд и набор команд:

Также должен быть посредник (Invoker), с которым взаимодействует клиент:

А теперь смотрим, как это все работает:

3. Паттерн Итератор

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

С PHP это легко реализовать, используя SPL (Standard PHP Library). Разберем пример. Изначально у нас есть радиостанция:

Далее вводим итератор:

Реализовываем:

4. Mediator паттерн

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

Рассмотрим на примере чата, где и будут использованы поведенческие паттерны Посредник. Есть окно чата:

Добавляем к нему пользователей:

Реализовываем:

5. Memento паттерн

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

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

Появляется сам редактор:

Используем:

6. Паттерн Наблюдатель

Люди, которые ищут работу, часто подписываются на сайты, где публикуются вакансии. Именно эти сайты уведомляют соискателей о подходящих должностях, и именно так работают поведенческие паттерны Observer.

Есть соискатели:

Добавляем вакансии, на которые можно подписываться:

Используем:

7. Паттерн Visitor

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

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

Работаем с разными видами животных:

Реализуем посетителя:

Используем:

8. Паттерн Стратегия

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

Имеем интерфейс и различные варианты реализации стратегии:

Теперь есть клиент, выбирающий один из вариантов:

Используем:

9. Паттерн Состояние

Допустим, вы используете приложение для рисования, где выбираете кисть. Теперь кисть меняет свое состояние в соответствии с выбранным цветом. То есть, если вы выбрали красный цвет, то и кисть будет рисовать красным.

Для кода используем пример с текстовым редактором, в котором можно изменить шрифт. У нас есть интерфейс и реализация некоторых состояний:

Добавляем редактор:

Реализовываем:

10. Паттерн Шаблонный Метод

Строим дом. Этапы работы выглядят так:

  • подготовка фундамента;
  • строительство стен;
  • добавление крыши;
  • добавление необходимого количества этажей.

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

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

Теперь реализации:

Используем:

 

Также рекомендуем Вам посмотреть:

Хотите получать больше интересных материалов с доставкой?

Подпишитесь на нашу рассылку:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




Комментариев: 4

  1. Как можно рассказывать о паттернах и не применять UML.

Добавить комментарий