Мост (Bridge) — различия между версиями
Admin (обсуждение | вклад) (→Описание) |
Admin (обсуждение | вклад) (→Использование) |
||
Строка 18: | Строка 18: | ||
=== Использование === | === Использование === | ||
+ | Паттерн Мост используется когда | ||
+ | * Необходимо менять реализацию во время выполнения | ||
+ | * И абстракции и реализации должны расширяться новыми подклассами | ||
+ | * При изменениях в реализации абстракции клиентский код, работающий с абстракцией, не должен перекомпилироваться | ||
=== Реализация === | === Реализация === |
Версия 09:03, 3 августа 2014
Другое название
Назначение
Позволяет менять интерфейс и реализацию независимо друг от друга.
Описание
Если для некоторой абстракции возможно несколько реализаций, то применяют наследование. Однако, такой подход плохо работает при наличии N абстракций и M реализаций: необходимо создать N*M классов, каждый из которых для i-той абстракции дает j-тую реализацию.
Например, при реализации библиотеки пользовательского интерфейса с N компонентами - наследниками класса Window - для M операционных систем потребуется полностью реализовывать N*M классов.
Паттерн Мост позволяет свести количество необходимых классов к N+M. Таким образом, при добавлении нового оконного компонента мы должны добавить один класс независимо от количества операционных систем. Аналогично при реализации всех компонент для новой операционной системы мы должны также добавить только один класс.
Основная идея паттерна Мост заключается в следующем: для базовой абстракции (в нашем примере для класса Window) имеется класс WindowImp (реализация), содержащий интерфейс примитивов рисования графических компонент. В классе Window все примитивы рисования реализуются делегированием к операциям класса WindowImp. Теперь в потомках класса Window мы реализуем рисование компонент с помощью базового набора примитивов в классе Window, а примитивы в классе WindowImp реализуются в подклассах для каждой операционной системы.
Связка классов Window - WindowImp и называется Мост.
Использование
Паттерн Мост используется когда
- Необходимо менять реализацию во время выполнения
- И абстракции и реализации должны расширяться новыми подклассами
- При изменениях в реализации абстракции клиентский код, работающий с абстракцией, не должен перекомпилироваться