Разделяет один или несколько классов на две отдельные иерархии - абстракцию и реализацию, позволяя изменять их независимо друг от друга.
«Абстракция» (или «интерфейс») - это образный слой управления чем-либо. Он не делает работу самостоятельно, а делегирует её слою «реализации» (иногда называемому «платформой»).
!!! Только не путайте эти термины с интерфейсами или абстрактными классами из вашего языка программирования, это не одно и то же.
Если говорить о реальных программах, то абстракцией может выступать графический интерфейс программы, а реализацией - API к которому интерфейс обращается по реакции на действия пользователя.
-
Когда вы хотите разделить монолитный класс, который содержит несколько различных реализаций какой-то функциональности (например, может работать с разными системами баз данных).
-
Чем больше класс, тем тяжелее разобраться в его коде, тем больше это затягивает разработку. Кроме того, изменения, вносимые в одну из реализаций, приводят к редактированию всего класса, что может привести к ошибкам.
Мост позволяет разделить монолитный класс на несколько отдельных иерархий. После этого вы можете менять их код независимо друг от друга. Это упрощает работу над кодом и уменьшает вероятность внесения ошибок.
-
-
Когда класс нужно расширять в двух независимых плоскостях.
- Мост предлагает выделить одну из таких плоскостей в отдельную иерархию классов, храня ссылку на один из её объектов в первоначальном классе.
-
Когда вы хотите, чтобы реализацию можно было бы изменять во время выполнения программы.
-
Мост позволяет заменять реализацию даже во время выполнения программы, так как конкретная реализация не «вшита» в класс абстракции.
Кстати, из-за этого пункта Мост часто путают со Стратегией. Обратите внимания, что у Моста этот пункт стоит на последнем месте по значимости, так как его главная задача - структурная.
-
-
Определите, существует ли в ваших классах два непересекающихся измерения. Это может быть функциональность/платформа, предметная-область/инфраструктура, фронт-энд/бэк-энд или интерфейс/реализация.
-
Продумайте, какие операции будут нужны клиентам и опишите их в базовом классе абстракции.
-
Определите поведения доступные на всех платформах и выделите из них ту часть, которая будет нужная абстракции. На основании этого опишите общий интерфейс реализации.
-
Для каждой платформы создайте свой класс конкретной реализации. Все они должны следовать общему интерфейсу, который мы выделили перед этим.
-
Добавьте в класс абстракции ссылку на объект реализации. Реализуйте методы абстракции, делегируя основную работу связанному объекту реализации.
-
Если у вас есть несколько вариаций абстракции, создайте для каждой из них свой подкласс.
-
Клиент должен подать объект реализации в конструктор абстракции, чтобы связать их воедино. После этого он может свободно использовать объект абстракции, забыв о реализации.
+ | - |
---|---|
Позволяет строить платформо-независимые программы. | Усложняет код программы за счёт дополнительных классов. |
Скрывает лишние или опасные детали реализации от клиентского кода. | |
Реализует принцип открытости/закрытости. |
-
Мост проектируют загодя, чтобы развивать большие части приложения отдельно друг от друга. Адаптер применяется постфактум, чтобы заставить несовместимые классы работать вместе.
-
Мост, Стратегия и Состояние (а также слегка и Адаптер) имеют схожие структуры классов - все они построены на принципе «композиции», то есть делегирования работы другим объектам. Тем не менее, они отличаются тем, что решают разные проблемы. Помните, что паттерны - это не только рецепт построения кода определённым образом, но и описание проблем, которые привели к данному решению.
-
Абстрактная фабрика может работать совместно с Мостом. Это особенно полезно, если у вас есть абстракции, которые могут работать только с некоторыми из реализаций. В этом случае фабрика будет определять типы создаваемых абстракций и реализаций.
-
Паттерн Строитель может быть построен в виде Моста: директор будет играть роль абстракции, а строители - реализации.