Образец Моста и Образец Стратегии - PullRequest
0 голосов
/ 27 сентября 2018

Есть много вопросов о том, как сравнивать паттерн Бридж и паттерн Стратегия.Объяснения включают

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

и

UML и код выглядят одинаково, но цель другая

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

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

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

Редактировать: По запросу я добавляю SO вопросы

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

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

1 Ответ

0 голосов
/ 02 октября 2018

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

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

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

Сводка

Мост

  • Абстракция has-a Абстракция
    1. Первая абстракция - это клиентский API.
    2. Вторая абстракция - это API-разработчик.
  • Разработчик скрыт от клиента и несоответствовать клиентскому API.
  • Клиентский API перенаправляет все вызовы разработчику.

Стратегия

  • Реализация has-aАбстракция
    1. Реализация - это клиент или объект, сконструированный клиентом.
    2. Абстракция - это API-интерфейс стратегии.
  • Конкретная стратегия - этовыбирается клиентом, поэтому его API известен и соответствует требованию клиента.
  • Реализация клиента перенаправляет одну конкретную операцию в стратегию.Остальная часть клиентского API не имеет отношения к этой стратегии.

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

...