#паттерны
Введение
Сегодня мы рассмотрим паттерн проектирования "Адаптер".
Классификация
Тип: Структурный
Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого.
Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером.
Из чего состоит и как работает паттерн адаптер
1. Клиент. Описывает бизнес логику программы. Работает с адаптером и другими объектами.
2. Интерфейс с которым может работать клиентский код.
3. Класс, который имеет нужную клиенту логику, однако клиент не может с ним общаться, так как интерфейс данного класса ему не понятен.
4. Адаптер - класс который помогает клиенту использовать функционал незнакомого ему сервиса в правильном формате. Реализует клиентский интерфейс. Содержит ссылку на незнакомый сервис. Адаптер при получении вызовов от клиента через клиентский интерфейс и переводит их в вызовы незнакомого сервиса в правильном формате.
Уточнение: Приложение должно использовать объект адаптера только через клиентский интерфейс. Это позволит легко создавать и изменять адаптеры в будущем.
Плюсы данного паттерна
1. Скрывает все "низкоуровневые" преобразования интерфейсов от клиента. Реализует принцип абстракция.
Минусы данного паттерна
Таковых я не обнаружил
Пример и задача
В качестве примера возьмём класс с методом do который возвращает небольшой текст. Также есть класс с методом secret_do который возвращает другую строку, зашифрованную шифром Цезаря со сдвигом 5, которая ещё и полностью развёрнута.
В виде клиента выступает функция которая постит текст в ваш блог.(Можете просто создать функцию которая выводит переданный в неё текст). Естественно она должна принимать только расшифрованный текст.
Реализуйте адаптер для второго класса, который спасёт ваш блог от зашифрованных постов.
Пример из реального кода
https://github.com/aiogram/aiogram/blob/b190bbba1915ed3b7f311a780f34723ebd6b5acd/aiogram/contrib/fsm_storage/redis.py#L280
Вот его объяснение какую задачу решает адаптер в данном случае:
Здесь адаптер дает возможность контроллеру хранилища (RedisStorage) работать с первой версией редиса, т.е. адаптирует aioredis-v1, там еще есть адаптер для aioredis-v2, но он в отличие от первой версии адаптирует только создание клиента редиса
Дополнительные материалы
https://habr.com/ru/post/85095/
Введение
Сегодня мы рассмотрим паттерн проектирования "Адаптер".
Классификация
Тип: Структурный
Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого.
Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером.
Из чего состоит и как работает паттерн адаптер
1. Клиент. Описывает бизнес логику программы. Работает с адаптером и другими объектами.
adapter = Adapter()
result = adapter.do() + "5"
2. Интерфейс с которым может работать клиентский код.
class Test1:
def do(self) -> str:
return "3"
3. Класс, который имеет нужную клиенту логику, однако клиент не может с ним общаться, так как интерфейс данного класса ему не понятен.
class Test2:
def specific_do(self) -> float:
return 3.4
4. Адаптер - класс который помогает клиенту использовать функционал незнакомого ему сервиса в правильном формате. Реализует клиентский интерфейс. Содержит ссылку на незнакомый сервис. Адаптер при получении вызовов от клиента через клиентский интерфейс и переводит их в вызовы незнакомого сервиса в правильном формате.
class Adapter(Test1, Test2):
def do(self) -> str:
return f"Translated: {round(self.specific_do())}"
Уточнение: Приложение должно использовать объект адаптера только через клиентский интерфейс. Это позволит легко создавать и изменять адаптеры в будущем.
Плюсы данного паттерна
1. Скрывает все "низкоуровневые" преобразования интерфейсов от клиента. Реализует принцип абстракция.
Минусы данного паттерна
Таковых я не обнаружил
Пример и задача
В качестве примера возьмём класс с методом do который возвращает небольшой текст. Также есть класс с методом secret_do который возвращает другую строку, зашифрованную шифром Цезаря со сдвигом 5, которая ещё и полностью развёрнута.
В виде клиента выступает функция которая постит текст в ваш блог.(Можете просто создать функцию которая выводит переданный в неё текст). Естественно она должна принимать только расшифрованный текст.
Реализуйте адаптер для второго класса, который спасёт ваш блог от зашифрованных постов.
Пример из реального кода
https://github.com/aiogram/aiogram/blob/b190bbba1915ed3b7f311a780f34723ebd6b5acd/aiogram/contrib/fsm_storage/redis.py#L280
Вот его объяснение какую задачу решает адаптер в данном случае:
Здесь адаптер дает возможность контроллеру хранилища (RedisStorage) работать с первой версией редиса, т.е. адаптирует aioredis-v1, там еще есть адаптер для aioredis-v2, но он в отличие от первой версии адаптирует только создание клиента редиса
Дополнительные материалы
https://habr.com/ru/post/85095/
GitHub
aiogram/aiogram/contrib/fsm_storage/redis.py at b190bbba1915ed3b7f311a780f34723ebd6b5acd · aiogram/aiogram
aiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio - aiogram/aiogram
👍1
Вопрос с собеседования
Что такое Dependency inversion principle?
Ответ опубликуем завтра, а пока пишите свои варианты в комментариях!
#interview
Что такое Dependency inversion principle?
Ответ опубликуем завтра, а пока пишите свои варианты в комментариях!
#interview
Вопрос с собеседования
Что такое Dependency inversion principle?
Ответ:
Dependency inversion principle - принцип инверсии зависимостей.
Зависимости внутри системы строятся на основе абстракций. Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
#interview
Что такое Dependency inversion principle?
Ответ:
Dependency inversion principle - принцип инверсии зависимостей.
Зависимости внутри системы строятся на основе абстракций. Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
#interview
🤮3🤩2😁1
Приспособленец (англ. Flyweight) — структурный паттерн проктирования. Он позволяет вместить большее количество объектов в отведенную оперативную память. Основная идея паттерна — различие между внутренним и внешним состоянием объекта. Внешнее состояние передается клиентом, использующим приспособленца, в некотором контексте. Внутреннее состояние хранится непосредственно в приспособленце и позволяет разделять их. Под разделением понимается возможность одновременной работы нескольких клиентов с одним и тем же приспособленцем.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Стратегия (англ. Strategy) относится к поведенческим шаблонам проектирования. Цель этого паттерна - выделить схожие алгоритмы, решающие конкретную задачу. Реализация алгоритмов выносится в отдельные классы и предоставляется возможность выбирать алгоритмы во время выполнения программы.Вам нужно добраться до аэропорта. Можно доехать на автобусе, такси или велосипеде. Здесь вид транспорта является стратегией. Вы выбираете конкретную стратегию в зависимости от контекста — наличия денег или времени до отлёта.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Конвертирует интерфейс класса в другой интерфейс, ожидаемый клиентом. Позволяет классам с разными интерфейсами работать вместе. О каком паттерне идёт речь?
Anonymous Quiz
1%
Строитель
90%
Адаптер
5%
Мост
4%
Компоновщик