Отделяет абстракцию от реализации, благодаря чему появляется возможность независимо изменять то и другое.
Назначение
Отделить абстракцию от реализации так, чтобы то и другое можно было изменять независимо.
Применимость
Используйте паттерн мост когда:
- хотите избежать постоянной привязки абстракции к реализации. Так, например, бывает, когда реализацию необходимо выбирать во время выполнения программы;
- и абстракции, и реализации должны расширяться новыми подклассами. В таком случае паттерн мост позволяет комбинировать разные абстракции и реализации и изменять их независимо;
- изменения в реализации абстракции не должны сказываться на клиентах, т.е. клиентский код не должен перекомпилироваться;
Структура
Участники
- Abstraction - абстракция: определяет интерфейс абстракции и хранит ссылку на объект типа Implementor;
- RefinedAbstraction - уточненная абстракция: расширяет интерфейс, определенный абстракцией Abstraction;
- Implementor -реализатор: определяет интерфейс для классов реализации. он не обязан точно соответствовать интерфейсу класса Abstraction. На самом деле оба интерфейса могут быть совершенно различны. Обычно интерфейс класса Implementor предоставляет только примитивные операции, а класс Abstraction определяет операции более высокого уровня, базирующиеся на этих примитивах;
- ConcreteImplementor - конкретный реализатор: содержит конкретную реализацию интерфейса Implementor.
Результаты
- отделение реализации от интерфейса. Реализация больше не имеет постоянной привязки к интерфейсу. Реализацию абстракции можно конфигурировать во время выполнения. Объект может даже динамически изменять свою реализацию. Разделение классов Abstraction и Implementor устраняет также зависимости от реализации, устанавливаемые на этапе компиляции. Чтобы изменить класс реализации, вовсе необязательно перекомпилировать класс Abstraction и его клиентов. Это свойство особенно важно, если необходимо обеспечить двоичную совместимость между разными версиями библиотеки классов. Кроме того, такое разделение облегчает разбиение системы на слои и тем самым позволяет улучшить ее структуру. Высокоуровневые части системы должны знать только о классах Abstraction и Implementor;
- повышение степени расширяемости. Можно расширять независимо иерархии классов Abstraction и Implementor;