Я вообще не понимаю шаблон проектирования "мост". Я прошел через различные веб-сайты, но они не помогли.
Кто-нибудь может помочь мне понять это?
Я вообще не понимаю шаблон проектирования "мост". Я прошел через различные веб-сайты, но они не помогли.
Кто-нибудь может помочь мне понять это?
Ответы:
В ООП мы используем полиморфизм, поэтому абстракция может иметь несколько реализаций. Давайте посмотрим на следующий пример:
Введено новое требование, и оно должно учитывать перспективу ускорения поездов, поэтому измените код, как показано ниже.
Приведенный выше код не подлежит сопровождению и не имеет возможности многократного использования (при условии, что мы могли бы повторно использовать механизм ускорения для той же платформы трека). Следующий код применяет шаблон моста и разделяет две разные абстракции: поездный транспорт и ускорение .
источник
Monorail
так как на самом деле это не два слова, это одно (составное) слово. MonoRail будет некоторым подклассом Rail вместо другого вида рельса (который он есть). Так же, как мы не будем использоватьSunShine
илиCupCake
, они будутSunshine
иCupcake
Хотя у большинства шаблонов проектирования есть полезные имена, я считаю, что имя «Мост» не является интуитивно понятным в отношении того, что оно делает.
Концептуально, вы помещаете детали реализации, используемые иерархией классов, в другой объект, обычно со своей собственной иерархией. Тем самым вы устраняете тесную зависимость от этих деталей реализации и позволяете изменить детали этой реализации.
В небольшом масштабе я уподобляю это использованию шаблона стратегии, чтобы вы могли подключить новое поведение. Но вместо того, чтобы просто обернуть алгоритм, как это часто наблюдается в стратегии, объект реализации обычно более функциональный. И когда вы применяете эту концепцию ко всей иерархии классов, большая модель становится мостовой. (Опять ненавижу имя).
Это не шаблон, который вы будете использовать каждый день, но я нашел его полезным при управлении потенциальным взрывом классов, который может произойти, когда у вас есть (очевидная) потребность в множественном наследовании.
Вот пример из реальной жизни:
У меня есть инструмент RAD, который позволяет вам удалять и настраивать элементы управления в области проектирования, поэтому у меня есть объектная модель, подобная этой:
И так далее, возможно, с десяток элементов управления.
Но затем добавляется новое требование для поддержки нескольких тем (look-n-feels). Скажем , у нас есть следующие темы:
Win32
,WinCE
,WinPPC
,WinMo50
,WinMo65
. Каждая тема будет иметь разные значения или реализации для операций, связанных с рендерингом, таких как DefaultFont, DefaultBackColor, BorderWidth, DrawFrame, DrawScrollThumb и т. Д.Я мог бы создать объектную модель, как это:
и т. д. для одного типа управления
и т. д., для каждого типа управления (снова)
Вы поняли - вы получаете классовое количество # виджетов, умноженное на # тем. Это усложняет RAD-дизайнер, заставляя его осознавать каждую тему. Кроме того, добавление новых тем заставляет модифицировать RAD-дизайнер. Кроме того, в теме есть много общих реализаций, которые было бы здорово наследовать, но элементы управления уже наследуются от общей базы (
Widget
).Поэтому вместо этого я создал отдельную иерархию объектов, которая реализует тему. Каждый виджет будет содержать ссылку на объект, который реализует операции рендеринга. Во многих текстах к этому классу добавляется суффикс,
Impl
но я отклонился от этого соглашения об именах.Так что теперь моя
TextboxWidget
выглядит так:И я могу сделать так, чтобы мои разные художники унаследовали мою тематическую базу, чего я не мог сделать раньше:
Одним из приятных моментов является то, что я могу динамически загружать реализации во время выполнения, что позволяет мне добавлять столько тем, сколько я хочу, без изменения основного программного обеспечения. Другими словами, моя «реализация может варьироваться независимо от абстракции».
источник
Win32TextboxPainter
иWin32ListPainter
откудаWin32WidgetPainter
. Вы можете иметь дерево наследования на стороне реализации, но оно должно быть более общим (возможноStaticStyleControlPainter
,EditStyleControlPainter
иButtonStyleControlPainter
) с любыми необходимыми примитивными операциями переопределены при необходимости. Это ближе к реальному коду, на котором я основывал пример.Мост намеревается отделить абстракцию от своей конкретной реализации , так что оба могут варьироваться независимо:
Мост достичь этого с помощью композиции:
Дополнительные замечания о частой путанице
Этот шаблон очень похож на шаблон адаптера: абстракция предлагает другой интерфейс для реализации и использует композицию для этого. Но:
В этой превосходной оригинальной книге по шаблонам проектирования авторы также отмечают, что:
источник