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

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

Міст (англ. Bridge) - шаблон проектування, відноситься до класу структурних шаблонів.

Зміст

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

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

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

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

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

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

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

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

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

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

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

[ред.] Джерела

  • Design Patterns: Elements of Reusable Object-Oriented Software