Evgenii Legotckoi
Evgenii Legotckoi24 сентября 2018 г. 5:05

Структурные шаблоны проектирования - Мост

Цели

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

Проблематика

«Укрепление программных связей» путем использования подкласса абстрактного базового класса для обеспечения альтернативных реализаций. Это блокирует привязку ко времени компиляции между интерфейсом и реализацией. Абстракция и реализация не могут быть независимо расширены или переопределены.


Мотивация

Рассмотрим область «планирования потоков».

Существует два типа планировщиков потоков, два типа операционных систем или «платформы». Учитывая этот подход к специализации, мы должны определить класс для каждого варианта из этих двух вариаций. Если мы добавим новую платформу (скажем ... виртуальную машину Java), как бы выглядела наша иерархия?

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

Шаблон проектирования Bridge предлагает рефакторинг этой экспоненциально взрывоопасной иерархии наследования в две ортогональные иерархии - одну для абстракций, независимых от платформы, а другую для зависимых от платформы реализаций.

Обсуждение

Разложите интерфейс компонента и реализацию в ортогональные иерархии классов. Класс интерфейса содержит указатель на абстрактный класс реализации. Этот указатель инициализируется экземпляром конкретного класса, но все последующее взаимодействие класса интерфейса с классом реализации ограничивается абстракцией, поддерживаемой в базовом классе реализации. Клиент взаимодействует с классом интерфейса и, в свою очередь, «делегирует» все запросы реализации класса.

Объект интерфейса - это «обработчик», известный и используемый клиентом; в то время как объект реализации или «тело» безопасно инкапсулирован, чтобы гарантировать, что он может продолжать развиваться или полностью заменяться (или использоваться во время выполнения.

Используйте шаблон Bridge, если:

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

Последствия включают:

  • декомпозициб интерфейса объекта
  • улучшенная расширяемость (вы можете расширить (например, подкласс) иерархии абстракции и реализации независимо),
  • скрытие деталей от клиентов.

Мост является синонимом идиомы «обработчик/тело». Это механизм проектирования, который инкапсулирует класс реализации внутри класса интерфейса. Первый - это тело, а второе - обработчик. Обработчик рассматривается пользователем как фактический класс, но работа выполняется в теле. «Идиома класса handle/body может использоваться для декомпозиции сложной абстракции на более мелкие, более управляемые классы. Идиома может отражать совместное использование одного ресурса несколькими классами, которые контролируют доступ к нему (например, подсчет ссылок)».

Структура

Клиент не хочет иметь дело с зависимыми от платформы деталями. Шаблон Bridge инкапсулирует эту сложность за абстракционную «обертку».

Bridge подчеркивает идентификацию и разделение абстракции «интерфейса» от абстракции «реализации».

Пример

Шаблон Bridge отделяет абстракцию от ее реализации, так что они могут варьироваться независимо друг от друга. Примером Моста является бытовой выключатель, управляющий огнями, потолочными вентиляторами и т. Д. Целью переключателя является включение или выключение устройства. Фактически переключатель может быть реализован как тянущая цепь, простой двухпозиционный переключатель или различные диммерные переключатели.

Контрольный список

  1. Решите, существуют ли в приложении две возможных ортогональных иерархии классов. Этими независимыми иерархиями могут быть: абстракция/платформа, или домен/инфраструктура, или интерфейс/интерфейс, или интерфейс/реализация.
  2. Разработайте разделение проблем: чего хочет клиент и что предоставляют платформы.
  3. Создайте платформенный интерфейс, который минимален, необходим и достаточен. Его цель - отделить абстракцию от платформы.
  4. Определить производный класс этого интерфейса для каждой платформы.
  5. Создайте базовый класс абстракции, который имеет «объект платформы» и делегирует ему платформенно-ориентированную функциональность.
  6. Определите специализации класса абстракции, если это необходимо.

Эмпирические правила

  • Адаптер позволяет работать c классами после того, как они разработаны; Мост заставляет их работать до того, как они были разработаны.
  • Мост разработан заранее, чтобы абстракция и реализация менялись независимо. Адаптер модернизирует код, чтобы классы работали вместе.
  • State, Strategy, Bridge (и до некоторой степени Adapter) имеют аналогичные структуры решений. Все они разделяют элементы идиомы «обработчик/тело». Они различаются по намерениям - то есть, они решают разные проблемы.
  • Структура State и Bridge идентична (за исключением того, что Bridge допускает иерархии классов, тогда как State допускает только одно). Эти два шаблона используют одну и ту же структуру для решения различных задач: State позволяет изменять поведение объекта вместе с его состоянием, в то время как намерение Моста состоит в том, чтобы отделить абстракцию от его реализации, чтобы они могли варьироваться независимо.
  • Если интерфейсы классов делегируют создание своих классов реализации (вместо того, чтобы напрямую создавать / связывать себя), тогда в проекте обычно используется шаблон Abstract Factory для создания реализации объектов.
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 1:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 1:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
i
innorwall14 ноября 2024 г. 21:26
Qt/C++ - Урок 031. QCustomPlot - строим график по времени buy generic priligy We can just chat, and we will not lose too much time anyway
i
innorwall14 ноября 2024 г. 19:03
Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
i
innorwall14 ноября 2024 г. 11:42
Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 ноября 2024 г. 9:09
Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
Сейчас обсуждают на форуме
i
innorwall14 ноября 2024 г. 3:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 ноября 2024 г. 10:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 октября 2024 г. 9:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов3 октября 2024 г. 4:05
Реализация навигации по разделам Спасибо Евгений!

Следите за нами в социальных сетях