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

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

Зміст

ПризначенняРедагувати

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

МотиваціяРедагувати

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

ЗастосовністьРедагувати

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

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

СтруктураРедагувати

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

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

ПеревагиРедагувати

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

НедолікиРедагувати

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

ВідносиниРедагувати

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

РеалізаціяРедагувати

C++Редагувати

ДжерелаРедагувати

ЛітератураРедагувати

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