02.01 2011

Bridge

Перед прочтением ознакомьтесь с введением в паттерны проектирования на PHP, в котором описаны принятые соглашения и понятия. Данная статья дополняется с некоторой периодичностью, так что если вы ее читали ранее, не факт что данные не изменились.

Bridge (Мост) относиться к классу структурных паттернов. Он используется для отделения абстракции от ее реализации так, чтобы то и другое можно было изменять независимо.

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

Давайте рассмотрим пример реализации системы, которая умеет отдавать данные сразу в нескольких представлениях: HTML, CLI, JSON, XML. Естественно мы хотим получить простую, расширяемую реализацию, которая позволила бы нам с легкостью это делать. В итоге приходим примерно к такой архитектуре:

Плохая архитектура

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

Плохая архитектура. Заметно?

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

Bridge (Мост)

При таком построении архитектуры, мы можем свободно изменять абстракцию и реализацию, наследовать и подменять. Полный код реализации на php я не стану здесь приводить, из-за довольно большого объема. Вы можете его посмотреть тут.

Заключение

Используйте мост, когда:

  • Хотите избежать постоянной привязки реализации к абстракции (например, когда реализацию необходимо выбирать во время выполнения).
  • Реализация и абстракция могут (или будут) дополняться через наследование
  • Изменение на абстракции или реализации не должны сказываться на клиенте
  • Количество классов начинает стремительно расти, не принося при этом реальной пользы
  • Вы хотите разделить одну реализации между разными абстракциями
  • Хотите повысить степень расширяемости
  • Хотите скрыть детали реализации от клиента

Родственным паттерном для моста является паттерн адаптер, который объединяет связанные части системы и предоставляет простой интерфейс. Правда мост, в отличие от адаптера, внедряется на этапе проектирования, а не на готовых рабочих системах.

comments powered by Disqus