Паттерны в разработке приложений. Поведенческие паттерны. Часть 2.
Published 21 февраля 2021 г. 10:11
А вот и долгожданная вторая часть разбора поведенческих паттернов! Между этим и предыдущим постом прошло довольно много времени, но (наконец!) сегодня нашему вниманию предстанут 5 шаблонов:
- Наблюдатель (Observer)
- Состояние (State)
- Стратегия (Strategy)
- Шаблонный метод (Template method)
- Посетитель (Visitor)
Что ж, пришло время познакомиться с ними поближе.
Наблюдатель
Паттерн наблюдатель позволяет организовать систему подписки одних объектов на другие, чтобы подписчики могли отслеживать изменения в объектах, на которые они подписаны, и реагировать на них.
Самый распространённый пример - поиск определённого товара в магазине. Согласитесь, было бы весьма утомительно каждый день приходить в магазин и спрашивать о наличии нужного вам товара. А теперь представьте другой сценарий. У магазина есть интернет-рассылка, но она лишь захламляет ваш почтовый ящик, а результат от неё точно такой же, как если бы вы ходили в магазин сами.
Observer позволяет избежать таких трудностей. Уведомление подписчиков происходит только тогда, когда изменяется объект их подписки. Издателю безразлично количество подписчиков, также он не ведёт их журнал (подписчики добавляются и удаляются самостоятельно).
Вспомните соцсети: если бы авторы контента с миллионами подписчиков добавляли каждого самостоятельно, то таких людей практически не существовало бы :-). Здесь и здесь есть ресурсы с кодом.
Состояние
Данный паттерн позволяет объектам менять своё поведение в зависимости от их состояний. Чтобы понять принцип работы паттерна, необходимо иметь базовые представления о конечном автомате или так называемой машиной состояний.
Представьте, что ваш объект должен динамически изменяться в зависимости от определённых параметров. Конечно, самый очевидный (и далеко не самый лучший) способ - создать условные конструкции. После написания первого десятка таких условий вы наверняка задумаетесь об упрощении ваших переходов. Тут как раз и пригодится паттерн Состояние.
Паттерн основан на создании отдельных классов для каждого состояния и вынесения поведения, характерного для этих состояний, в эти классы. Ресурсы с кодом код1 и код2.
Стратегия
Шаблон Стратегия позволяет определить семейство схожих алгоритмов и заменять их в ходе выполнения программы.
Например, когда вы сохраняете документ в Word, вам предлагаются различные типы файлов: docx, doc, pdf и т. д. Это и есть наглядное представление работы шаблона стратегия. По сути, алгоритмы сохранения файлов схожи, однако, в зависимости от формата сохраняемого файла, детали этой процедуры могут отличаться. И, конечно же, ресурсы с кодом код1 и код2.
Шаблонный метод
Этот паттерн позволит вам создать некий каркас алгоритма, общие шаги которого исполняются внутри него, а выполнение специфических операций перекладывается на отдельные подклассы.
Допустим, у вас есть несколько бд, к которым необходимо получить доступ. Алгоритм подключения к любой бд состоит из создания соединения и получения данных. Вместо того, чтобы плодить дублирующий код в каждом подклассе (например для MySql и Postgresql), мы можем вынести общие шаги в отдельный класс, а некоторые особенности (строка-команда для создания соединения) оставить в подклассах. Примеры: код1 и код2.
Посетитель
Посетитель позволяет добавить поведение классам, не изменяя их изнутри. У программистов не всегда есть возможность редактировать исходники кода, а добавлять новые функции по заказу клиента надо (печаль (-_-)). Бывают случаи, когда надо добавить одинаковое поведение в большое количество классов, а, как мы знаем, много дублируемого кода не есть хорошо.
Посетитель спешит на помощь (конечно не такой, как на фото выше :-)). Паттерн позволяет разместить новое поведение в отдельном классе. Классы, которым необходимо добавить новые функции, передают объекты визитёрам. Ресурсы: код1 и код2.
Вот и подошло концу наше путешествие по миру паттернов. Пройдя этот долгий путь, мы разобрали типы паттернов и рассмотрели каждый из них в отдельности. Паттерны позволяют нам найти способ решения многих проблем, возникающих в процессе разработки ПО и в этом их несомненная польза. Однако не стоит злоупотреблять ими, так как они лишь **способ решения**, а не само решение!
И на этой ноте желаю вам попробовать и оценить паттерны проектирования, ну и конечно же, кода без багов!
Похожие публикации
Паттерны в разработке приложений. Поведенческие паттерны. Часть 1.
Паттерны в разработке приложений. Структурные паттерны