Обзор паттерна проектирования фасадов и его реализации в Dart и Flutter
В прошлой статье я проанализировал один из паттернов поведенческого проектирования - Состояние. На этот раз я хотел бы представить шаблон, который вы, вероятно, уже использовали как разработчик, но просто не осознавали, что это вообще шаблон проектирования. Поэтому позвольте мне познакомить вас с Фасадом.
Оглавление
- Что такое шаблон проектирования фасада?
- Анализ
- Реализация
- Другие статьи из этой серии
- Ваш вклад
Что такое паттерн проектирования фасада?
Фасад относится к категории структурных шаблонов проектирования. Его намерение в книге GoF описывается так:
Предоставляет единый интерфейс для набора интерфейсов в подсистеме. Фасад определяет интерфейс более высокого уровня, который упрощает использование подсистемы.
Паттерн Фасад очень прост - он позволяет вам создать упрощенный класс, который охватывает набор методов / операций сложного API или подсистемы. Клиенты общаются с подсистемой только через этот фасадный класс, который перенаправляет все запросы соответствующим объектам подсистемы. В результате количество зависимостей и ссылок между клиентом и подсистемами уменьшается (между ними усиливается слабая связь), фасад предоставляет простой интерфейс подсистемы, который достаточно хорош для большинства клиентов.
И это почти все. Действительно, это так просто! Конечно, больше информации можно найти в разделах «Анализ» и «Реализация», так что давайте углубимся в детали.
Анализ
Общая структура паттерна проектирования фасада выглядит так:
- Фасад - знает, какие классы подсистем отвечают за запрос, и делегирует запрос объектам подсистемы. Фасад предоставляет методы для доступа к определенной части функциональности подсистемы;
- Дополнительный фасад - может быть создан, когда вы хотите извлечь набор операций из главного фасада. Этот дополнительный фасад не является обязательным и может использоваться как клиентами, так и другими фасадами;
- Классы подсистем - реализуют функциональные возможности подсистем и обрабатывают работу, назначенную объектом Фасад. Классы подсистем не сохраняют ссылки на фасад;
- Клиент - использует фасад вместо прямого вызова системных классов (их объектов) .
Применимость
Существует два основных варианта использования шаблона проектирования фасадов:
- Если вы хотите предоставить простой интерфейс для сложной системы. Обычно подсистемы усложняются по мере развития, и их становится сложнее использовать для клиентов. Следовательно, первая часть этого варианта использования - предоставить упрощенный класс наиболее часто используемых функций подсистемы, который соответствует большинству требований клиентов. Вторая часть заключается в том, что шаблон проектирования фасадов позволяет уменьшить взаимосвязь между несколькими подсистемами, требуя, чтобы они взаимодействовали только через фасады.
- Когда существующий API очень велик, и вы хотите использовать только его часть. В этом случае шаблон проектирования фасада обертывает необходимые операции / методы API, и клиент может использовать эту оболочку «упрощенного API» - фасад - вместо того, чтобы ссылаться на исходный огромный API с ненужными методами, которые не используются в программе / приложении. код.
Реализация
Допустим, вы хотите осуществить свою мечту об умном доме. Вы купили много интеллектуальных устройств у разных поставщиков и подключили их к своей сети, но есть проблема - каждое устройство предоставляет свой интерфейс (назовите его API), поэтому становится очень утомительно управлять разными устройствами по отдельности для выполнения одной задачи. .
Например, вы хотите посмотреть фильм, как в кино. Для этого вы должны аналогичным образом настроить домашнюю среду:
- Выключить свет;
- Включи телевизор;
- Включите аудиосистему;
- Подключитесь к какой-либо платформе потоковой передачи фильмов, например Netflix;
- Начните воспроизведение фильма.
Для всех этих шагов вам нужно вызвать несколько API только для настройки вашей среды. Разве не было бы неплохо просто сказать «Начни играть в Матрицу в режиме домашнего кинотеатра» своему умному домашнему помощнику или включить один переключатель в своем мобильном приложении для умного дома и выполнить все эти шаги как одно действие? Для реализации такой функциональности отличный вариант - паттерн Фасад!
Диаграмма классов
На диаграмме классов ниже показана реализация паттерна проектирования фасада:
Для связи со смарт-устройствами (включения и выключения) предоставляется несколько API: AudioApi, CameraApi, PlaystationApi, SmartHomeApi и TvApi. NetflixApi предоставляет методы для подключения к платформе Netflix, отключения от нее и воспроизведения выбранного фильма.
API-интерфейсы используются классами фасадов:
- GamingFacade - использует PlaystationApi и CameraApi и предоставляет методы, связанные с игровыми и потоковыми действиями;
- SmartHomeFacade - использует AudioApi, CameraApi, SmartHomeApi, TvApi и NetflixApi. Он предоставляет методы для игр, потоковые действия (GamingFacade повторно используется с некоторыми дополнительными коммуникациями вместе с другими интеллектуальными устройствами) и действия, связанные с воспроизведением фильма с платформы Netflix.
Оба фасада используют класс SmartHomeState для сохранения текущего состояния интеллектуальных устройств.
Виджет FacadeExample содержит SmartHomeFacade для связи со смарт-устройствами с помощью предоставленных методов действия на фасаде.
API
AudioApi - API для включения / выключения умных динамиков.
CameraApi - API для включения / выключения потоковой камеры.
NetflixApi - API для подключения к платформе Netflix, отключения от нее и воспроизведения фильма.
PlaystationApi - API для включения / выключения игровой консоли (PlayStation).
SmartHomeApi - API для включения / выключения умного освещения.
TvApi - API для включения / выключения смарт-ТВ.
Котята перерыв
Если вы дочитали до этого места, вы определенно заслужили это!
SmartHomeState
Класс, в котором хранится текущее состояние всех умных устройств дома.
ИгровойФасад
Класс фасада, который использует API-интерфейсы PlayStation и потоковой камеры и предоставляет упрощенные методы их использования:
- startGaming () - использует PlaystationApi для включения игровой консоли;
- stopGaming () - использует PlaystationApi для выключения игровой консоли;
- startStreaming () - использует CameraApi для включения потоковой камеры и вызывает метод startGaming;
- stopStreaming () - использует CameraApi для выключения потоковой камеры и вызывает метод stopGaming.
Умный ДомФасад
Класс фасада, использующий API смарт-ТВ, аудиоустройств, платформы Netflix и оборудования для умного дома. Также используется GamingFacade. Предусмотрено несколько методов для упрощения действий умного дома:
- startMovie () - использует несколько различных API для выключения света, включения Smart TV и динамиков, подключения к платформе Netflix и начала воспроизведения выбранного фильма;
- stopMovie () - использует несколько различных API для отключения от Netflix, выключения Smart TV и динамиков, а также снова включает свет;
- startGaming () - использует SmartHomeApi для выключения света, включает Smart TV с помощью TvApi и вызывает GamingFacade , чтобы начать игровую сессию;
- stopGaming () - использует GamingFacade для остановки игрового сеанса, выключает Smart TV с помощью TvApi и снова включает свет с помощью SmartHomeApi;
- startStreaming () - использует SmartHomeApi для включения света, включает Smart TV с помощью TvApi и вызывает GamingFacade , чтобы начать сеанс потоковой передачи;
- stopStreaming () - использует GamingFacade для остановки сеанса потоковой передачи, выключает Smart TV с помощью TvApi и снова включает свет с помощью SmartHomeApi.
Пример
Прежде всего, подготавливается файл разметки, который предоставляется как описание шаблона:
Виджет FacadeExample содержит SmartHomeState, который содержит текущее состояние интеллектуальных устройств, и SmartHomeFacade для упрощения «интеллектуальных действий».
Этот виджет знает только упрощенные методы, предоставляемые фасадом умного дома, но не заботится о деталях их реализации, зависимостях между классами или другими фасадами и количестве различных API, используемых для выполнения одного действия. Это позволяет реализовать сложную логику для обработки действий умного дома, просто включив / выключив переключатель в виджетах ModeSwitcher. Кроме того, детали реализации методов обработки интеллектуальных устройств в SmartHomeFacade могут быть изменены / улучшены без изменения кода пользовательского интерфейса.
Окончательный результат реализации паттерна проектирования фасадов выглядит так:
Как вы можете видеть в примере, достаточно просто включить / выключить переключатель, чтобы взаимодействовать с несколькими интеллектуальными устройствами и изменять их состояние с помощью предоставленных методов фасада.
Все изменения кода для паттерна проектирования фасада и его пример реализации можно найти здесь.
Другие статьи из этой серии
- 0 - Введение
- 1 - Синглтон
- 2 - Адаптер
- 3 - Шаблонный метод
- 4 - Композитный
- 5 - Стратегия
- 6 - Государство
- 8 - Переводчик
- 9 - Итератор
- 10 - Заводской метод
- 11 - Абстрактная фабрика
- 12 - Команда
- 13 - Memento
- 14 - Прототип
- 15 - Прокси
- 16 - Декоратор
- 17 - Мост
- 18 - Строитель
- 19 - Наилегчайший вес
- 20 - Цепочка ответственности
- 21 - Гость
- 22 - Посредник
- 23 - Наблюдатель
Ваш вклад
👏 Нажмите кнопку хлопка ниже, чтобы выразить свою поддержку и побудить меня писать лучше!
💬 Оставьте отзыв на эту статью, поделившись своими мыслями, комментариями или пожеланиями относительно серии.
📢 Поделитесь этой статьей со своими друзья, коллеги в социальных сетях.
➕ Подписывайтесь на меня на Medium.
⭐ Пометьте репозиторий Github.