Міст (шаблон проєктування)

Міст (англ. Bridge) — шаблон проєктування, призначений для того, щоб відділити абстракцію від її конкретної імплементації таким чином, щоб вони могли бути змінені незалежно один від одного. Належить до класу структурних шаблонів.

Призначення ред.

Відокремити абстракцію від її реалізації таким чином, щоб перше та друге можна було змінювати незалежно одне від одного.

Терміни абстракція та реалізацію не мають нічого спільного з абстрактним класом чи інтерфейсом мови програмування. Абстракція — це уявний рівень керування чим-небудь, що не виконує роботу самостійно, а делегує її рівню реалізації.

Мотивація ред.

Якщо для деякої абстракції можливо кілька реалізацій, зазвичай застосовують наслідування. Абстрактний клас визначає інтерфейс абстракції, а його конкретні підкласи по-різному реалізують його. Але такий підхід не завжди є достатньо гнучким. Наслідування жорстко прив'язує реалізацію до абстракції, що перешкоджає незалежній модифікації, розширенню та повторному використанню абстракції та її реалізації.

Застосовність ред.

Слід використовувати шаблон Міст у випадках, коли:

  • треба запобігти постійній прив'язці абстракції до реалізації. Так, наприклад, буває коли реалізацію необхідно обрати під час виконання програми;
  • як абстракції, так і реалізації повинні розширюватись новими підкласами. У цьому разі шаблон Міст дозволяє комбінувати різні абстракції та реалізації та змінювати їх незалежно одне від одного;
  • зміни у реалізації не повинні впливати на клієнтів, тобто клієнтський код не повинен перекомпілюватись;
  • треба повністю сховати від клієнтів реалізацію абстракції;
  • треба розподілити одну реалізацію поміж кількох об'єктів (можливо застосовуючи підрахунок посилань), і при цьому приховати це від клієнта.

Структура ред.

 
UML діаграма, що описує структуру шаблону проєктування Міст
  • Abstraction — абстракція:
    • визначає інтерфейс абстракції;
    • зберігає посилання на об'єкт типу Implementor;
  • RefinedAbstraction — уточнена абстракція:
    • розширює інтерфейс, означений абстракцією Abstraction;
  • Implementor — реалізатор:
    • визначає інтерфейс для класів реалізації. Він не зобов'язаний точно відповідати інтерфейсу класу Abstraction. Насправді обидва інтерфейси можуть бути зовсім різними. Зазвичай, інтерфейс класу Implementor надає тільки примітивні операції, а клас Abstraction визначає операції більш високого рівня, що базуються на цих примітивах;
  • ConcreteImplementor — конкретний реалізатор:
    • містить конкретну реалізацію інтерфейсу класу Implementor.

Коли існує тільки одна реалізація, то в C++ цей шаблон називається Pimpl.

Переваги та недоліки ред.

Переваги ред.

  • Від'єднання абстракції від реалізації
  • Зменшення кількості підкласів
  • Чистий код і зменшенням розміру виконуваного файлу
  • Інтерфейс і реалізація можуть варіюватися самостійно
  • Покращена розширюваність - абстракції та впровадження можуть бути розширені самостійно

Недоліки ред.

  • Підвищує складність.
  • Подвійна спрямованість - це матиме невеликий вплив на продуктивність.

Відносини ред.

Об'єкт Abstraction містить у собі Implementor і перенаправляє йому запити клієнта.

Зв'язок з іншими патернами ред.

  • Міст — це структурний патерн. Його компоненти зазвичай встановлюються раз і не змінюються під час виконання програми. Використовують для розділення абстракції та реалізації. Стратегія — це шаблон поведінки. Використовують коли алгоритми можуть замінювати один одного під час виконання програми.

Реалізація ред.

C++ ред.

C# ред.

Crystal ред.

PHP ред.

Scala ред.

Python ред.

Джерела ред.

Література ред.

Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.