Модель моста и модель стратегии

Есть много вопросов по поводу сравнения паттерна «Мост» и паттерна «Стратегия». Пояснения включают

Мост структурный, а стратегия - поведенческая

и

UML и код похожи, но цель разная

среди других менее распространенных.

Ни одно из объяснений, которые я встретил здесь или где-либо еще, не является удовлетворительным. Я четко знаю, когда использую паттерн Стратегия и паттерн Мост, из-за моего намерения и проблемы, которую мне нужно решить, но на расстоянии различие стирается. Таким образом, я время от времени занимаюсь этим вопросом.

Если я использую шаблон «Мост» при моделировании структуры компонентов, не становится ли он, естественно, шаблоном стратегии во время выполнения?

Изменить: по запросу я добавляю ТАК вопросов

В этом ответе говорится, что диаграмма и код UML схожи, но причины использования могут отличаться. В этом ответе говорится, что их синтаксис похож, но цели разные. В этом ответе говорится, что один из них является структурным, а другой - поведенческим. Этот ответ очень близок, но, в конце концов, нет единой причины, по которой мост также является стратегией во время выполнения. Этот ответ тоже стоит прочитать, но он по-прежнему вызывает тот же вопрос; становится ли шаблон Моста шаблоном стратегии во время выполнения? Наше намерение - единственная разница?

Изменить 2: я хотел бы задать другой вопрос. Если искать только исходный код, скажем, этот пример шаблона стратегии и этот пример шаблона моста, как вы можете отличить шаблон моста от шаблона стратегии? Похоже, мы можем заменить их на образцы кода, и учебные пособия все еще имеют смысл.


person ozgur    schedule 27.09.2018    source источник
comment
Пожалуйста, дайте ссылку на вопросы SO, которые вы цитируете.   -  person jaco0646    schedule 27.09.2018
comment
Лучшее сравнение двух шаблонов здесь: stackoverflow.com/a/29545680/1371329   -  person jaco0646    schedule 27.09.2018
comment
@ jaco0646 отредактирую. Кстати, я не цитирую, я резюмирую.   -  person ozgur    schedule 27.09.2018
comment
@ jaco0646 у предоставленной вами ссылки есть хороший ответ. Но мой вопрос немного другой.   -  person ozgur    schedule 27.09.2018
comment
@ozgur Проблема в том, что ваш пример связанного моста слишком упрощен. Например, он не использует какие-либо свойства класса Circle, в отличие от версии Википедии. Если вы не используете свойства, вы рассматриваете только поведение, а не структуру, и это одна из причин, по которой ваш пример почти сводится к стратегии.   -  person pere57    schedule 03.10.2018
comment
@ pere57 Тогда паттерн Мост - это надмножество паттерна Стратегия? Если я использую только методы, а не свойства, это становится шаблоном стратегии.   -  person ozgur    schedule 03.10.2018


Ответы (1)


Поверхностные сравнения Моста и Стратегии, кажется, сосредоточены на композиционных отношениях между основными компонентами каждого паттерна. Эта взаимосвязь является ложной основой для сравнения, потому что большинство шаблонов проектирования GoF используют композицию (отсюда и их знаменитый принцип: «Отдайте предпочтение композиции объектов наследованию классов»).

Напротив, обратите внимание, что отношение композиции в Bridge связывает одну абстракцию с другой, тогда как отношение композиции в стратегии связывает реализацию с абстракцией. Мост полезен, когда клиент зависит от (абстрактного) API, который реализован в виде отдельного, отличающегося API. Стратегия полезна, когда клиент представляет собой конкретную реализацию, поведение которой можно изменить с помощью нескольких алгоритмов.

Также существует разница в объеме абстракции между этими шаблонами. Bridge использует один API для полной реализации другого. Клиентский API делегирует все вызовы разработчику (незаметно для клиента). Стратегия использует API как часть клиентской реализации. Стратегия не реализует весь клиентский API.

Резюме

Мост

  • Abstraction has-a Abstraction
    1. The first abstraction is the client API.
    2. Вторая абстракция - это API разработчика.
  • Разработчик скрыт от клиента и не соответствует клиентскому API.
  • Клиентский API перенаправляет все вызовы разработчику.

Стратегия

  • Implementation has-a Abstraction
    1. The implementation is the client, or an object constructed by the client.
    2. Абстракция - это API стратегии.
  • Клиент выбирает конкретную стратегию, поэтому его API известен и соответствует требованиям клиента.
  • Реализация клиента направляет в стратегию одну конкретную операцию. Остальная часть клиентского API не связана с этой стратегией.

Наконец, обратите внимание, что ни один из этих шаблонов не особенно распространен в современном ООП. Bridge - это нишевый случай, требующий априорного планирования, в то время как стратегия теперь поддерживается изначально с помощью лямбда-выражений или замыканий.

person jaco0646    schedule 02.10.2018
comment
Мост тесно связан с адаптером. Разница между шаблоном моста и шаблоном адаптера также может устранить некоторую путаницу. - person jaco0646; 05.02.2020