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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Міст (англ. 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.