Мост - построение мостов между двумя различными типизациями классов
Фасад - скрывает реализацию за собой
Адаптер - позволяет вставить новый объект в существующий код
Прокси - позволяет добавить логику перед нашим классом
Композит - упрощает работу с древовидными структурами кода
Декоратор
106 Bridge
Проблема:
Нам нужно реализовать уведомления, которые будут приходить либо в телегу, либо в whatsup. Так же уведомления могут быть мгновенные, либо отложенные. Расширение логики приведёт к тому, что классов для реализации функционала придётся делать больше в геометрической прогрессии
Мы имеем основной класс NotificationSender и через метод provider взаимодействуем с интерфейсом IProvider, который уже влияет на провайдеров. Это позволяет через композицию решить проблему с реализацией взаимодействия
И вот пример реализации паттерна, где у нас в отправителе сообщений присутствует метод-мост, который опирается на интерфейс провадера. Мы можем обращаться к любому провайдеру ровно потому, что уже имеем определённый интерфейс, через который будет осуществляться взаимодействие
107 Facade
У нас есть реализация большого количества действий при отправке того же сообщения: отправка сообщения на сервер, запись в БД, логирование сообщения, отправка уведомления пользователю
Чтобы легко реализовывать определённые задачи и каждый раз не прописывать все действия вручную, можно создать класс, который скроет всю реализацию и станет прослойкой для реализации быстрой отправки того же сообщения
Реализация паттерна фасада, где класс композиционирует все остальные класса, чтобы предоставить пользователю единый интерфейс для реализации нужной задачи
108 Adapter
Паттерн Адаптер позволяет подготовить сходу неподходящий объект к использованию в нашем коде.
Самый простой пример из жизни: нам нужно воткнуть USB 3.0 в Type-C. Сделать это просто так не получится и поэтому нам нужно использовать переходик - адаптер.
Пример: нам нужно адаптировать все вызовы KVDatabase к персистентной БД
Решается проблема через адаптор, который расширяется от нашей БД и через конструктор прокидывается к нашей персистентной БД
Этот паттерн используется для адаптации приложения к работе с другими, внешними, полезными библиотеками, которые приложение по умолчанию не сможет поддерживать
109 Proxy
Паттерн прокси позволяет нам настроить доступность к определённым участкам кода и к определённой функциональности.
У нас есть определённое АПИ для работы с платежами. Мы можем с ним работать из кода. Однако перед нами встаёт задача, что нам нужно ограничить возможность работы с АПИ, чтобы управлять доступом к нему.
Решить проблему мы можем через внедрение зависимости от PaymentAPIProxy и влиять на АПИ платежей через этот прокси. И в этом прокси мы можем кэшировать запросы, проверять доступ к этим запросам и т.д.
Этот паттерн может быть полезен, когда нам нужно добавить дополнительные настройки логики над существующим функционалом в программе
110 Composite
Паттерн композит позволяет нам объединить большие блоки кода в такую последовательность, где мы сможем от родителей элементов проводить воздействие на эти компоненты
Пример: нам нужно получить общую стоимость товаров. В магазине может быть как один небольшой товар, так и сразу группа товаров
Решить нашу проблему мы можем через создание отдельного интерфейса, который будет хранить в себе общие методы для получения информации из всех элементов. То есть он нам даст одинаковые функции получения стоимости для всех сущностей-родителей
Данный паттерн используется тогда, когда нам нужно работать с древовидными структурами, вложенными друг в друга