Обзор паттерна проектирования фасадов и его реализации в Dart и Flutter

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

Оглавление

  • Что такое шаблон проектирования фасада?
  • Анализ
  • Реализация
  • Другие статьи из этой серии
  • Ваш вклад

Что такое паттерн проектирования фасада?

Фасад относится к категории структурных шаблонов проектирования. Его намерение в книге GoF описывается так:

Предоставляет единый интерфейс для набора интерфейсов в подсистеме. Фасад определяет интерфейс более высокого уровня, который упрощает использование подсистемы.

Паттерн Фасад очень прост - он позволяет вам создать упрощенный класс, который охватывает набор методов / операций сложного API или подсистемы. Клиенты общаются с подсистемой только через этот фасадный класс, который перенаправляет все запросы соответствующим объектам подсистемы. В результате количество зависимостей и ссылок между клиентом и подсистемами уменьшается (между ними усиливается слабая связь), фасад предоставляет простой интерфейс подсистемы, который достаточно хорош для большинства клиентов.

И это почти все. Действительно, это так просто! Конечно, больше информации можно найти в разделах «Анализ» и «Реализация», так что давайте углубимся в детали.

Анализ

Общая структура паттерна проектирования фасада выглядит так:

  • Фасад - знает, какие классы подсистем отвечают за запрос, и делегирует запрос объектам подсистемы. Фасад предоставляет методы для доступа к определенной части функциональности подсистемы;
  • Дополнительный фасад - может быть создан, когда вы хотите извлечь набор операций из главного фасада. Этот дополнительный фасад не является обязательным и может использоваться как клиентами, так и другими фасадами;
  • Классы подсистем - реализуют функциональные возможности подсистем и обрабатывают работу, назначенную объектом Фасад. Классы подсистем не сохраняют ссылки на фасад;
  • Клиент - использует фасад вместо прямого вызова системных классов (их объектов) .

Применимость

Существует два основных варианта использования шаблона проектирования фасадов:

  1. Если вы хотите предоставить простой интерфейс для сложной системы. Обычно подсистемы усложняются по мере развития, и их становится сложнее использовать для клиентов. Следовательно, первая часть этого варианта использования - предоставить упрощенный класс наиболее часто используемых функций подсистемы, который соответствует большинству требований клиентов. Вторая часть заключается в том, что шаблон проектирования фасадов позволяет уменьшить взаимосвязь между несколькими подсистемами, требуя, чтобы они взаимодействовали только через фасады.
  2. Когда существующий 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 могут быть изменены / улучшены без изменения кода пользовательского интерфейса.

Окончательный результат реализации паттерна проектирования фасадов выглядит так:

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

Все изменения кода для паттерна проектирования фасада и его пример реализации можно найти здесь.

Другие статьи из этой серии

Ваш вклад

👏 Нажмите кнопку хлопка ниже, чтобы выразить свою поддержку и побудить меня писать лучше!
💬 Оставьте отзыв на эту статью, поделившись своими мыслями, комментариями или пожеланиями относительно серии.
📢 Поделитесь этой статьей со своими друзья, коллеги в социальных сетях.
➕ Подписывайтесь на меня на Medium.
⭐ Пометьте репозиторий Github.