Міст (шаблон проектування)
Матеріал з Вікіпедії — вільної енциклопедії.
Міст (англ. Bridge) - шаблон проектування, відноситься до класу структурних шаблонів.
Зміст |
[ред.] Призначення
Відокремити абстракцію від її реалізації таким чином, щоб перше та друге можна було змінювати незалежно одне від одного.
[ред.] Мотивація
Якщо для деякої абстракції можливо кілька реалізацій, зазвичай застосовують спадкування. Абстрактний клас визначає інтерфейс абстракції, а його конкретні підкласи по-різному реалізують його. Але такий підхід не завжди є достатньо гнучким. Спадкування жорстко прив'язує реалізацію до абстракції, що перешкоджає незалежній модифікації, розширенню та повторному використанню абстракції та її реалізації.
[ред.] Застосовність
Слід використовувати шаблон Міст у випадках, коли:
- треба запобігти постійній прив'язці абстракції до реалізації. Так, наприклад, буває коли реалізацію необхідно обрати під час виконання програми;
- як абстракції, так і реалізації повинні розширюватись новими підкласами. У цьому разі шаблон Міст дозволяє комбінувати різні абстракції та реалізації та змінювати їх незалежно одне від одного;
- зміни у реалізації не повинні впливати на клієнтів, тобто клієнтський код не повинен перекомпілюватись;
- треба повністю сховати від клієнтів реалізацію абстракції;
- треба розподілити одну реалізацію поміж кількох об'єктів (можливо застосовуючи підрахунок посилань), і при цьому приховати це від клієнту.
[ред.] Структура
- Abstraction – абстракція:
- визначає інтерфейс абстракції;;
- зберігає посилання на об'єкт типу Implementor;
- RefinedAbstraction – уточнена абстракція:
- розширює інтерфейс, означений абстракцією Abstraction;
- Implementor – реалізатор:
- визначає інтерфейс для класів реалізації. Він не зобов'язаний точно відповідати інтерфейсу класу Abstraction. Насправді обидва інтерфейси можуть бути зовсім різними. Зазвичай, інтерфейс класу Implementor надає тільки примітивні операції, а клас Abstraction визначує операції більш високого рівня, що базуються на цих примітивах;
- ConcreteImplementor – конкретний реалізатор:
- містить конкретну реалізацію інтерфейсу класу Implementor.
[ред.] Відносини
Об'єкт Abstraction переспрямовує своєму об'єкту Implementor запити клієнту.
[ред.] Джерела
- Design Patterns: Elements of Reusable Object-Oriented Software