Паттерн «Мост» (Bridge) Описание и пример реализации

Паттерн «Мост» предназначен для оптимизации сложных структур объектов.

Его смысл в том, чтобы разделить абстракцию и реализацию таким образом, чтобы они могли изменяться независимо друг от друга. Это даёт весьма положительный эффект, когда абстракция и реализация должны расширяться новыми подклассами или меняется не только сам объект, но и функции, которые он выполняет.

Описание

Паттерн «Мост» включает следующих участников:

  • Abstarction – абстракция.
    Определяет интерфейс абстракции и хранит ссылку на объект Implementor;
  • RefinedAbstraction – уточнённая абстракци.
    Расширяет интерфейс определённый Abstraction;
  • Implementor – реализатор.
    Определяет интерфейс реализации. Интерфейс реализации необязательно должен совпадать с интерфейсом абстрации;
  • ConcretteImplementor – конкретный реализатор.
    Содержит конкретную реализацию интерфейса класса Implementor;
  • Client – использует объекты Abstraction.

Ниже приведена диаграмма классов паттерна «Мост».

Примеры реализации
Пример на C#

Создаём базовый класс абстракции:

Создаём класс уточнённой абстракции:

Опишем интерфейс реализатора:

И два конкретных реализатора. Конкретный реализатор «A»:

Конкретный реализатор «B»:

Работу паттерна можно продемонстрировать на простом примере:

Паттерн «Мост» позволяет задавать реализацию, как при создании объекта абстракции, так и в процессе работы с ним меняя её «на ходу».

Результат работы приведённого примера показан на скриншоте ниже.

Пример на Delphi

Теперь рассмотрим реализацию паттерна «Мост» на языке программирования Delphi.

Базовый класс абстракции:

Класс уточнённой абстракции:

Далее создадим базовый класс реализатора. В Delphi отсутствует полноценная поддержка интерфейсов. Поэтому реализация паттерна строится полностью на основе абстрактных классов.

Далее напишем два конкретных реализатора.

Конкретный реализатор «A»:

Конкретный реализатор «B»:

В итоге получаем реализацию аналогичную той, что была выполнена на C#.

Частные случаи

Выше было дано описание и приведены примеры для классического паттерна «Мост», который описан в литературе [1]. Но, для этого паттерна также существует ряд частных случаев, которые обладают меньшей гибкостью, но в определённых ситуациях их применение может быть оправдано.

Примеры кода для них приводить не будем, та как в подавляющем большинстве случаев речь идёт об упрощении архитектуры паттерна.

  • Объединение абстракций.
    Если уточнённая абстракция только одна, то необходимость в базовом классе абстракции по сути отпадает. Но, если необходимость расширения архитектуры не исключена лучше использовать классический вариант;
  • Исключение произвольного задания реализации.
    Если данная уточнённая абстракция должна работать только с определённым списком реализаторов, имеет смысл ограничить их выбор либо исключить его вовсе.
    Пример последнего, конструктор класса уточнённой реализации не принимающий в качестве параметра реализатор. Вместо этого реализатор по умолчанию прописан в коде класса.
  • Исключение смены реализации «на ходу».
    Если реализация, которая используется уточнённой абстракцией не должна меняться, целесообразно исключить члены класса, которые обеспечивают такую возможность.
Источники:
  1. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приёмы объектно-ориентированного проектирования. Паттерны проектирования.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *