Шаблон проектирования Bridge

Назначение шаблона Bridge - отделить абстракцию от ее реализации так, чтобы и то, и другое можно было изменять независимо.

Bridgeuml

Изображение с сайта http://ru.wikipedia.org

Проще всего понять, что такое шаблон Bridge, если вспомнить компоненту View в модели MVC.

Допустим, у нас есть текстовые объекты различных типов: Книги, статьи, динамически-формируемые страницы каталогов, справки и т.п. При этом, каждый документ может быть представлен в разных форматах: pdf, rtf, html и др.

Если мы начнем создавать иерархии классов вот так:

то модификация системы, добавление нового формата данных, или нового типа данных превращается в работу весьма сложную, чреватую дублированием кода, структура программы становится запутанной.

Именно поэтому, в данном случае будет полезно разделить саму структуру объектов и работу над их внешним видом.

У нас появляется новая структура:

В ней присутствует деление на абстракцию Abstraction (объекты документов) и реализацию Implementation (компоненты View).

Такая система легко расширяется.

Указанные принципы структурирования программы используются и в тех случаях, когда необходимо сделать переносимый графический интерфейс для какой-либо программы - создаются классы, которые будут отвечать за отрисовку интерфейса в разных средах.

Почему этот шаблон называют "Bridge" - мне не понятно. Этот шаблон так же имеет название "Handle/Body". Мне кажется, это чуть ближе по смыслу.

Пример реализации паттерна Bridge - 1

test.pl :

Document.pm :

Document/Book.pm :

View.pm :

View/Html.pm :

View/PDF.pm :

Запускаем скрипт на выполнение:

 

Пример реализации паттерна Bridge - 2

Чистый пример, с соответствующей терминологией.

test.pl :

Abstraction.pm :

Abstraction/RefinedAbstraction.pm :

Implementator.pm :

Implementator/ConcreteImplementatorA.pm :

Implementator/ConcreteImplementatorB.pm :

Запускаем на выполнение:

Полезные ссылки по теме "паттерн Bridge"

habrahabr.ru: Шаблон Bridge дополнительные штрихи

github.com: Пример кода шаблона Bridge