Кто-нибудь когда-либо использовал паттерн моста в реальном приложении? Если да, то как ты это использовал? Это я, или это просто паттерн адаптера с небольшим внедрением зависимостей в микс? Это действительно заслуживает своего собственного образца?
design-patterns
adapter
bridge
Чарльз Грэм
источник
источник
Ответы:
Классический пример шаблона Bridge используется в определении фигур в среде пользовательского интерфейса (см. Статью Wikipedia по шаблону Bridge ). Схема моста представляет собой композит из шаблона и стратегии шаблонов.
Это общий вид некоторых аспектов шаблона адаптера в шаблоне моста. Однако, чтобы процитировать из этой статьи :
источник
Есть комбинация ответов Федерико и Джона .
Когда:
Рефакторинг для:
источник
Паттерн «Мост» - это применение старого совета «предпочитайте композицию наследованию». Это становится удобным, когда вы должны создавать подклассы разного времени так, чтобы они были ортогональны друг другу. Скажем, вы должны реализовать иерархию цветных фигур. Вы бы не создали подкласс Shape с Rectangle и Circle, а затем создали бы подкласс Rectangle с RedRectangle, BlueRectangle и GreenRectangle и то же самое для Circle, не так ли? Вы бы предпочли сказать, что у каждой фигуры есть Цвет и реализовать иерархию цветов, и это - Образец Моста. Ну, я бы не реализовал "иерархию цветов", но вы поняли ...
источник
Когда:
Рефакторинг для:
источник
Адаптер и Мост, безусловно, связаны, и различие тонкое. Вполне вероятно, что некоторые люди, которые думают, что используют один из этих шаблонов, фактически используют другой шаблон.
Объяснение, которое я видел, заключается в том, что Adapter используется, когда вы пытаетесь объединить интерфейсы некоторых несовместимых классов, которые уже существуют . Адаптер функционирует как своего рода переводчик для реализаций, которые можно считать устаревшими .
Принимая во внимание, что паттерн Bridge используется для кода, который, скорее всего, будет новым. Вы проектируете Bridge для предоставления абстрактного интерфейса для реализации, которая должна изменяться, но вы также определяете интерфейс этих классов реализации.
Драйверы устройств - часто цитируемый пример Bridge, но я бы сказал, что это Bridge, если вы определяете спецификацию интерфейса для поставщиков устройств, но это Adapter, если вы берете существующие драйверы устройств и делаете класс-оболочку для обеспечить единый интерфейс.
Таким образом, с точки зрения кода, эти две модели очень похожи. В бизнесе они разные.
Смотрите также http://c2.com/cgi/wiki?BridgePattern
источник
По моему опыту, Bridge является довольно часто повторяющимся шаблоном, потому что это решение, когда в области есть два ортогональных измерения . Например, формы и методы рисования, поведение и платформы, форматы файлов и сериализаторы и так далее.
И совет: всегда думайте о шаблонах проектирования с концептуальной точки зрения , а не с точки зрения реализации. С правильной точки зрения Bridge нельзя спутать с Adapter, потому что они решают другую проблему, а композиция превосходит наследование не потому, что она сама по себе, а потому, что она позволяет обрабатывать ортогональные задачи отдельно.
источник
Назначение моста и адаптера различно, и нам нужны оба шаблона по отдельности.
Образец моста:
Используйте шаблон Bridge, когда:
@ Джон Сонмез ответ ясно показывает эффективность схемы моста в сокращении иерархии классов.
Вы можете обратиться к ссылке ниже документации, чтобы лучше понять шаблон моста с примером кода
Адаптер шаблон :
Ключевые отличия:
Связанный вопрос SE с диаграммой UML и рабочим кодом:
Разница между образцом моста и образцом адаптера
Полезные статьи:
статья об образцовых мостах
sourcemaking адаптер шаблон статьи
journaldev мост шаблон статьи
РЕДАКТИРОВАТЬ:
Пример реального использования Bridge Pattern (в соответствии с предложением meta.stackoverflow.com, включенный в этот пост пример сайта с документацией, поскольку документация собирается заходить)
Шаблон моста отделяет абстракцию от реализации, так что оба могут варьироваться независимо. Это было достигнуто с помощью композиции, а не наследования.
Шаблон моста UML из Википедии:
У вас есть четыре компонента в этом шаблоне.
Abstraction
: Он определяет интерфейсRefinedAbstraction
: Реализует абстракцию:Implementor
: Он определяет интерфейс для реализацииConcreteImplementor
: Он реализует интерфейс реализатора.The crux of Bridge pattern :
Две ортогональные иерархии классов с использованием композиции (и без наследования). Иерархия абстракций и иерархия реализации могут варьироваться независимо. Реализация никогда не относится к абстракции. Абстракция содержит интерфейс реализации в качестве члена (посредством композиции). Эта композиция уменьшает еще один уровень иерархии наследования.Реальный вариант использования слова:
Разрешить разные транспортные средства, чтобы иметь обе версии ручной и автоматической системы передач.
Пример кода:
вывод:
Объяснение:
Vehicle
это абстракция.Car
иTruck
две конкретные реализацииVehicle
.Vehicle
определяет абстрактный метод:addGear()
.Gear
интерфейс разработчикаManualGear
иAutoGear
две реализацииGear
Vehicle
содержитimplementor
интерфейс, а не реализацию интерфейса.Compositon
Интерфейс разработчика - суть этого паттерна: он позволяет абстракции и реализации варьироваться независимо.Car
иTruck
определяют реализацию (Redefined абстракции) для абстракции:addGear()
: Он содержитGear
- либоManual
илиAuto
Варианты использования для шаблона Bridge :
источник
Я использовал шаблон моста на работе. Я программирую на C ++, где его часто называют идиомой PIMPL (указатель на реализацию). Это выглядит так:
В этом примере
class A
содержится интерфейс иclass Aimpl
содержит реализацию.Одним из применений этого шаблона является предоставление только некоторых открытых членов класса реализации, но не других. Только в примере
Aimpl::foo()
можно вызвать через открытый интерфейсA
, но неAimpl::bar()
Еще одним преимуществом является то, что вы можете определить
Aimpl
в отдельном заголовочном файле, который не должен быть включен пользователямиA
. Все, что вам нужно сделать, это использовать предварительное объявлениеAimpl
доA
определения и перенести определения всех функций-членов, ссылающихсяpImpl
на файл .cpp. Это дает вам возможность сохранятьAimpl
заголовок закрытым и сократить время компиляции.источник
Чтобы поместить пример формы в код:
Выход:
Обратите внимание на легкость, с которой новые цвета и формы могут быть добавлены в систему, не приводя к взрыву подклассов из-за перестановок.
источник
для меня я думаю об этом как о механизме, где вы можете менять интерфейсы. В реальном мире у вас может быть класс, который может использовать более одного интерфейса, Bridge позволяет вам менять местами.
источник
Вы работаете в страховой компании, в которой вы разрабатываете приложение для документооборота, которое решает различные задачи: бухгалтерский учет, заключение договоров, претензии. Это абстракция. Что касается реализации, вы должны иметь возможность создавать задачи из разных источников: электронная почта, факс, электронная почта.
Вы начинаете свой дизайн с этих классов:
Теперь, поскольку каждый источник должен обрабатываться определенным образом, вы решаете специализировать каждый тип задачи:
Вы заканчиваете 13 классов. Добавление типа задачи или типа источника становится сложной задачей. Использование шаблона моста упрощает поддержку, отделяя задачу (абстракцию) от источника (что является проблемой реализации):
Добавление типа задачи или источника теперь стало намного проще.
Примечание. Большинство разработчиков не создавали бы иерархию 13 классов заранее для решения этой проблемы. Однако в реальной жизни вы можете заранее не знать количество типов источников и задач; если у вас есть только один источник и два типа задач, вы, вероятно, не отделите задачу от источника. Затем общая сложность возрастает по мере добавления новых источников и типов задач. В какой-то момент вы проведете рефакторинг и, чаще всего, получите мостоподобное решение.
источник
источник