Библиотека программиста | программирование, кодинг, разработка
82.2K subscribers
3.11K photos
147 videos
88 files
6.35K links
Все самое полезное для программиста в одном канале.

Список наших каналов: https://tttttt.me/proglibrary/9197
Учиться у нас: https://proglib.io/w/a32a0d94

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv
Прайс: @proglib_advertising
Download Telegram
#fundamental #patterns #cheatsheet

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

Можно привести аналогию из жизни: Вы оформили подписку на журнал, после чего вам больше не нужно ездить в супермаркет и проверять, не вышел ли очередной номер. Вместо этого издательство регулярно присылает новые номера по почте прямо к вам домой сразу после их выхода.
Издательство ведёт список подписчиков и знает, кому какой журнал высылать. Вы можете в любой момент отказаться от подписки, и журнал перестанет вам приходить.

Паттерн Наблюдатель применяется, когда система обладает следующими свойствами:
✔️Существует как минимум один объект, рассылающий сообщения.
✔️Имеется не менее одного получателя сообщений, причём их количество и состав могут изменяться во время работы приложения.
✔️Позволяет избежать сильного зацепления взаимодействующих классов.
#fundamental #patterns #cheatsheet

📌 Состояние (англ. State) — поведенческий паттерн, позволяющий объектам менять поведение в зависимости от своего состояния.

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

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

Решение: создать отдельные классы для каждого состояния, в котором может пребывать объект, а затем вынести туда поведения, соответствующие этим состояниям.

Паттерн применяется, когда:
✔️Есть объект, поведение которого кардинально меняется.
✔️Код класса содержит множество похожих условных операторов.
#fundamental #patterns #cheatsheet

📌 Стратегия (англ. Strategy) — поведенческий паттерн, опредяющий семейство схожих алгоритмов и помещающий каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять во время исполнения программы.

Идея: использовать различные бизнес-правила или алгоритмы исходя из контекста.

Проблема: по типу клиента (или по типу обрабатываемых данных) выбрать подходящий алгоритм, который следует применить.

Решение: определить семейство схожих и часто изменяющихся/расширяющихся алгоритмов, и вынести их в собственные классы-стратегии.

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

Паттерн применяется, когда:
✔️Необходимо использовать разные вариации какого-то алгоритма внутри одного объекта.
✔️Есть множество похожих классов, отличающихся только некоторым поведением.
✔️Не хотитите обнажать детали алгоритмов для других классов.
#fundamental #patterns #cheatsheet

📌 Шаблонный метод (англ. Template Method) — поведенческий паттерн, определяющий основу алгоритма и позволяющий подклассам переопределять некоторые шаги алгоритма, не меняя его общей структуры.

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

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

Паттерн применяется, когда:
✔️Подклассы должны расширять базовый алгоритм, не меняя его структуры.
✔️Есть несколько классов, реализующих одно и то же с незначительными отличиями.
#fundamental #patterns #cheatsheet

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

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

Решение: разместить новое поведение в отдельном классе, вместо его размножения сразу в нескольких классах. Объекты, с которыми должно было быть связано поведение, не будут выполнять его самостоятельно. Вместо этого вы будете передавать эти объекты в методы посетителя.

Паттерн применяется, когда:
✔️Требуется выполнить какую-то операцию над всеми элементами структуры объектов, например, деревом.
✔️Над объектами сложной структуры объектов необходимо выполнять некоторые не связанные между собой операции, но вы не хотите «засорять» классы такими операциями.
✔️Новое поведение имеет смысл только для некоторых классов из существующей иерархии.
#fundamental #patterns #cheatsheet

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

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

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

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