Мост-vs стратегия-шаблон

Я знаю, этот вопрос задавался много раз, но я сделал некоторые исследования, и до сих пор не понимаю, наверное, вы можете мне помочь: Как говорилось много раз, UML почти такой же. Также реализация и идея более или менее одинаковы: вместо подтипа вы определяете интерфейс, который инкапсулирует некоторую логику и давайте перейдем к абстрактному. Итак, даже ребята из Microsoft-Blog

https://blogs.msdn.microsoft.com/gyanjadal/2015/01/05/difference-between-strategy-and-bridge-patterns/ говорит:

простой ответ: "они похожи, но разные". Этот реализации схожи, но намерения различны. Дать возможность аналогия, городской автобус и школьный автобус-это похожие транспортные средства, но они используются для различных целей. Используется для перевозки людей между различными частями города в пригородные услуга. Другое используется для транспортировки детей в школы.

"Если это звучит как утка и выглядит как утка, но она намеревается быть лебедем, это может быть любой из них", что я читаю здесь.

Так как я все еще не получил его, поэтому я копнул глубже:

https://social.msdn.microsoft.com/Forums/en-US/08775d39-2de0-4598-8872-df21f681b7b3/strategy-vs-bridge-patterns?forum=architecturegeneral

этот поток также не добавляет ничего нового, кроме:

Они оба выглядят одинаково на поверхности для меня. Сеть разница, которую я вижу, заключается в том, что в схеме моста абстракция является частью объекта, но в шаблоне стратегии абстракция выполняется объектом.

но, если мы читаем определение стратегии:

определения семейства алгоритмов, инкапсуляции каждого из них и сделать их сменный. Стратегия позволяет алгоритм варьируется независимо от клиенты, которые его используют.

нет ничего определенного, как применяется стратегия. Это также может быть интерфейс на абстрактном, точно такой же общей стратегии-реализации, как LINQ-Orderby и т. д.

еще один интерес взять на эту тему здесь:

http://game-engineering.blogspot.ch/2008/07/bridge-pattern-vs-strategy-pattern.html

в mainpart от этого excourse:

вы говорите "стратегия", когда хотите изменить поведение, и вы этого не делаете путем написания различных объектов, но путем введения класса heirarchy. Вы скажите "мост" , когда вы ожидаете, что вы будете варьировать как интерфейс, так и реализация. В обоих случаях вы обеспечиваете гибкость изменение реализации; в мосту, вы также ожидаете интерфейс для изменения.

Это, вероятно, основное различие? Поскольку конструктор и абстракция настолько свободна, что я могу изменить интерфейс реализатора, и абстракции не нужно заботиться? Это звучит разумно, но тогда не было бы абстракции, чтобы изменить, так как они связаны с kindahow? Разве это не разрушит все другие принципы, такие как скрытие и сушка информации?

Я также просмотрел много примеров, которые я не добавляю здесь ради места, и я не мог найти пример ни одного из этих шаблонов, которые я не мог измените, чтобы соответствовать другому. Будь то через интерфейс-свойство или параметр.

Я что-то пропустил? Возможно, у кого-то есть реальный пример "я хотел использовать стратегию, но мост просто лучше подходил" или наоборот, например?

Edit: почему я оправдываю собственный поток для этой темы (снова)? Прежде всего, принятый ответ упомянутого потока следующий

Как я понимаю, вы используете шаблон стратегии когда вы абстрагирование поведения, которое может быть предоставлено из внешнего источника (напр. config может указать, чтобы загрузить некоторую сборку плагина), и вы Использование шаблона моста при использовании одних и тех же конструкций для создания код немного аккуратнее. Фактический код будет выглядеть очень похожим - вы просто применяю паттерны по несколько иным причинам.

Я уже предоставил в предыдущих объяснениях, что абстрагирование поведения от внешнего источника является именно определение стратегии - и мост-шаблон.

и

и вы используете шаблон моста, когда используете те же конструкции чтобы сделать ваш код немного аккуратнее.

также шаблон стратегии делает код более аккуратным, так как он абстрагирует целый строительный блок, таким образом, немного увеличивает код.

Я думаю, что любой, кто читает всю тему, видит, что есть больше по этой теме, Чем это 2 предложения.

2 ответов


Википедия UML диаграмма для шаблона моста:

Wikipedia UML Diagram for Bridgeвзгляните на мой ответ в связанном вопросе для основных различий:

в чем разница между шаблоном моста и шаблон стратегии?

основные отличия: абстракция и реализация могут меняться независимо.

относительно других ваших запросов:

это наверное, главное-разница? Поскольку реализатор и абстракция настолько слабо связаны, я могу изменить интерфейс реализатора, и абстракции не нужно заботиться? Это звучит разумно, но тогда не было бы абстракции, чтобы изменить, так как они связаны с kindahow?

посмотрите ниже пример кода @

когда вы используете шаблон мост? Чем он отличается от адаптера шаблон?

хотя пример находится в java, его можно легко понять для разработчиков c#.

в связано примеру:

Vehicle            : Abstraction
Car                : Re-defined Abstraction
Truck              : Re-defined Abstraction
Implementor        : GearShifter
ConcreteImplementor: ManualGearShifter  
ConcreteImplementor: AutoGearShifter 

Keynotes:

  1. теперь Vehicle и GearShifter можете самостоятельно изменить.

  2. если Vehicle изменения, только Car и Truck надо менять.

  3. если GearShifter изменения, только ManualGearShifter и AutoGearShifter надо менять.

  4. С Vehicle(абстракция) содержит GearShifter(реализация) через состав, изменения в GearShifter не влияет Vehicle

  5. С GearShifter (implementor) не содержит или не ссылается Vehicle (абстракция), изменения в абстракции не влияют на реализацию.

EDIT:

шаблон моста представляет две ортогональные иерархии классов -для Абстракция и один для исполнителя, который может быть изменен независимо без зависимости от других.


Я проверил оригинал шаблоны проектирования книги чтобы увидеть, как авторы определяли шаблон моста. Их пример показывает случай, когда и иерархии абстракции и имлементации могут изменяться независимо (т. е. для абстракции могут быть введены новые подклассы; новые подклассы могут быть введены для реализаций). Их пример касается библиотеки окон, которая может работать для разных оконных систем. В оригинальном примере авторы использовали разные оконная система от IBM, но я считаю, что хорошей текущей аналогией будут разные оконные менеджеры Linux (GNOME, KDE и т. д.). Итак, представьте себе абстракцию окна и две реализации для GNOME и KDE. А теперь представьте, что вы хотите добавить новый подкласс окна, TransparentWindow. TransparentWindow расширяет окно, так как GNOMEWindow и KDEWindow. Но вы также должны предоставить imlementations для TransparentWindow: GNOMETransparentWindow и KDETransparentWindow. Иерархия начинает выглядеть неопрятно. Представьте себе новый тип окна или новый диспетчер окон - XFCE. Чтобы избежать сложных иерархий, они вводят шаблон моста и разделяют две иерархии (т. е. TransparentWindow расширяет окно; GNOMEWindow и KDEWindow расширяют WindowImpl). Мне кажется, что сложная часть-определить интерфейс для реализации, так как иерархии абстракций должны будут определять свои операции, используя только этот интерфейс. Пример обучения модели моста, который мне понравился здесь, и мне понравилось, потому что он не использует искусственные классы ConcreteImplementor1 и ConcreteImplementor2. Когда дело доходит до реальных примеров, я считаю, что видел этот шаблон в реализации Selenium WebDriver, но сейчас я не уверен на 100%.