Стратегия против Мостовых паттернов - PullRequest
32 голосов
/ 03 мая 2011

Я знаю, что этот вопрос задавался ранее (например, В чем разница между шаблоном моста и шаблоном стратегии? ).

Однако, может кто-нибудь объяснить, используяПримеры, в чем разница, и в каких случаях один должен быть выбран над другим?Менее концептуальная теория, более практичные "реальные" сценарии были бы оценены.

Ответы [ 8 ]

38 голосов
/ 03 мая 2011

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

Шаблоны на Java, том 1: каталог многократно используемых шаблонов проектирования, иллюстрированных с использованием UML, второе издание

Вам необходимо предоставить классы для доступа к физическим датчикам, таким как весы, приборы для измерения скорости и т. Д. Каждый датчик выдает число, но число может означать разные вещи. Для шкалы это может означать вес, а для устройства измерения скорости это может означать скорость.

Таким образом, вы можете начать с создания абстрактного класса Sensor, который будет отображать общность между всеми датчиками и различными подклассами для различных типов датчиков. Это надежная конструкция, позволяющая в будущем предоставлять гораздо больше типов датчиков.

Теперь предположим, что датчики поставляются разными производителями. Вам нужно будет создать иерархию классов датчиков для производителя X и другую для производителя Y. Теперь проблема заключается в том, что клиенты должны знать разницу между производителями. А если вы решите поддержать третьего производителя ...?

Решением является обеспечение основной иерархии абстракции, т.е. абстрактный класс датчика и подклассы, такие как SpeedSensor и WeightSensor и так далее. Затем предоставьте интерфейс (Bridge), который будет существовать между абстракцией и реализацией. Таким образом, будут SensorInterface, WeightSensorInterface и SpeedSensorInterface, которые определяют интерфейс, который должен предоставлять каждый конкретный класс датчиков. Абстракция не знает о реализации, скорее она знает об интерфейсе. Наконец, вы можете создать конкретную реализацию для каждого производителя. Это XSensor, XWeightSensor и XSpeedSensor, YSensor, YSpeedSensor и YWeightSensor.

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

Как видите, здесь описан способ структурирования ваших классов.

Стратегия, с другой стороны, связана с изменением поведения объекта во время выполнения. Мне нравится использовать пример игры с персонажем, который обладает несколькими видами оружия. Персонаж может атаковать, но поведение атаки зависит от оружия, которое персонаж держит в то время, и это не может быть известно во время компиляции.

Таким образом, вы делаете поведение оружия сменным и вводите его в персонажа по мере необходимости. Отсюда и поведенческий паттерн.

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

Вот несколько ссылок, которые могут быть полезны:

  1. Образец моста
  2. Шаблон стратегии
27 голосов
/ 09 апреля 2015

Я могу сказать, что это трудно объяснить. Многим людям, которые его используют и понимают, трудно объяснить это новичкам.

Для таких, как я, которые думают в терминах аналогий:

Шаблон стратегии

Таким образом, стратегия является своего рода одномерной концепцией. Подумайте об одномерном множестве стратегий на выбор.

Пример 1. Инструменты сантехника

Шаблон стратегии подобен водопроводчику, у которого есть различные инструменты, чтобы получить незасоренную трубу. Работа одинакова каждый раз; это чтобы прочистить трубу. Но инструмент, который он выбирает, чтобы сделать это, может варьироваться в зависимости от ситуации. Может быть, он попробует один, и если это не сработает, он попробует другой.

В этой аналогии «разрубить трубу» - это метод, который будет реализовывать одну из стратегий. Змеиная щетка, силовой шнек и дренаж - это конкретные стратегии, а сантехник - это класс, содержащий метод (на большинстве диаграмм помеченный как «Контекст»).

enter image description here

Пример 2: многобитовая отвертка

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

enter image description here

Образец моста

Итак, мост - это двумерная концепция. Представьте, что одно измерение (строки) - это список методов, которые необходимо реализовать, а второе измерение (столбцы) - это реализаторы, которые будут реализовывать каждый из этих методов.

Пример 1. Приложения и устройства

Шаблон моста подобен человеку, у которого есть множество способов общения (электронная почта, текст, голос Google, телефон, Skype) и множество устройств, с которыми они могут общаться различными способами - ПК, планшет, и смартфон.

Различные способы связи (электронная почта, текст, телефон) - это методы в абстрактном интерфейсе, назовем его «CommunicationDevice». В этом шаблоне CommunicationDevice является исполнителем. Каждое устройство в этой аналогии (ПК, планшет, смартфон) является ConcreteImplementor, который реализует все эти методы (электронная почта, текст, телефон).

enter image description here

Пример 2. Драйверы базы данных Odbc и функции odbc

Другим готовым примером моста являются модули драйверов баз данных odbc или oledb из Windows. Все они реализуют различные методы в одном и том же стандартном интерфейсе «драйвер базы данных», но реализуют этот интерфейс по-разному. Даже если вы используете одну и ту же базу данных, скажем, Sql Server, все еще существуют разные драйверы, которые могут взаимодействовать с Sql Server, хотя и разными способами под прикрытием.

Пример 3. Реализаторы (столбцы), реализующие методы (строки)

Implementors (columns) implementing methods (rows)

3 голосов
/ 03 мая 2011

Шаблон стратегии

Этот шаблон позволяет алгоритму, который выполняется, варьироваться независимо от клиентов, которые его используют.т. е. вместо использования фиксированного алгоритма для выполнения данной ситуации, он позволяет один из многих алгоритмов быть выбран на лету во время выполнения .Это включает удаление алгоритма из его основного класса и помещение его в отдельный класс.

Например, предположим, что кто-то хочет путешествовать из города в другой, тогда у него есть несколько вариантов: сесть на автобус, нанять автомобиль, сесть на поезд и т. д. Таким образом, каждый выбранный вид транспорта будет реализован в отдельном алгоритме.Выбранный вид транспорта будет зависеть от различных факторов, определяемых во время выполнения (стоимость, время и т. Д.).Другими словами, стратегия, выбранная для выполнения, будет решена на лету.

Другой пример: предположим, что нужно реализовать класс SortedList (основной контроллер), который Sorts основан на strategy.Стратегия - это метод, который используется для сортировки (например, MergeSort, QuickSort).

Сравнение с шаблоном моста

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

Обратите внимание, что большинство алгоритмов могут быть реализованы как статические или одноэлементные классы, требующие только одного экземплярасоздание (то есть new не вызывается каждый раз, когда устанавливается стратегия).

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

// Set implementation and call
// i.e. Returns (creates) the concrete implementation of the object, 
// subsequently operation is called on the concrete implementation
ab.Implementor = new ConcreteImplementorA(); 
ab.Operation();

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

// Set the context with a strategy
// i.e. Sets the concrete strategy into the context, concrete implementation of the class not 
// directly available as a data object (only the algorithm is available).    
context = new Context (new ConcreteStrategyA());     
context.contextInterface();

// Strategy can be reused instead of creating a new instance every time it is used.
// Sort example
MergeSort mergeSort = new MergeSort();
QuickSort quickSort = new QuickSort();
...
context = new Context (mergeSort);
context.Sort();
...
context = new Context (quickSort);
context.Sort();
...
context = new Context (mergeSort);
context.Sort();
1 голос
/ 04 февраля 2016

Стратегия:

  1. Стратегия - это модель поведенческого проектирования.Если используется для переключения между семейством алгоритмов.

  2. Этот шаблон содержит одну абстрактную стратегию интерфейс и множество конкретной стратегии реализации ( алгоритмы ) этого интерфейса.

  3. Приложение использует стратегию interface only.В зависимости от некоторых параметров конфигурации конкретная стратегия будет помечена как interface .

Мост:

  1. Он позволяет абстракциям и реализациям варьироваться независимо .
  2. Он использует композицию поверх наследования.
  3. Мост - это структурный шаблон .

например, классы коллекций в java.util. List реализовано ArrayList.

Тем не менее, кто-то может объяснить, используя четкие примеры, в чем разница и в каких случаях следует выбирать одно над другим?

1061*

В краткой заметке:

  1. Используйте шаблон Стратегия для динамического изменения реализации путем замены одной стратегии другой стратегией.

    Пример одного реального слова: Авиакомпании, предлагающие скидки в непиковые месяцы .Просто измените стратегию дисконтирования тарифов со стратегией без скидок во время высокого пика.

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

    Один реальный пример в автомобильной промышленности: Различные типы Gears могут быть собраны в различные типы Cars .Спецификация и реализация Car и Gear могут изменяться независимо друг от друга.

1 голос
/ 30 июля 2014

Шаблон Стратегии инкапсулирует алгоритмы, так что они могут использоваться и изменяться в сложной программе (без объединения работ), а шаблон Bridge позволяет двум интерфейсам свободно связываться, чтобы они могли взаимодействовать, но могли изменяться независимо друг от друга.

Вы можете найти примеры PHP шаблонов Bridge и Strategy здесь:

http://www.php5dp.com/category/design-patterns/bridge/

и

http://www.php5dp.com/category/design-patterns/strategy/

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

1 голос
/ 04 сентября 2013

Шаблон Bridge рассказывает, как организовать классы, Стратегия - как организовать алгоритмы.

0 голосов
/ 12 декабря 2013

Оба шаблона отделяют интерфейс от реализации. Я думаю, что ключевым отличием является то, что в паттерне моста используется наследование («является»), а в паттерне стратегии используется композиция («имеет»).

Образец моста:

class Sorter abstract
{ 
   virtual void Sort() = 0;
}

// MergeSorter IS A Sorter
class MergeSorter : public Sorter
{
   virtual void Sort() override;
}

Шаблон стратегии:

class SortStrategy abstract
{
   virtual void Sort() = 0;
}

// Sorter HAS A SortStrategy
class Sorter
{ 
   Sorter(SortStragety *strategy) : mStrat(strategy) {}

   void Sort() {mStrat->Sort();}

   SortStrategy *mStrat;
}
0 голосов
/ 03 мая 2011

Позвольте мне рассказать ответы на связанный вопрос.

Шаблон моста - это структурный шаблон, то есть он излагает идеи о том, как создать компонент вашего проекта.Он используется, чтобы скрыть два уровня абстракций.Пример кода в Википедии (http://en.wikipedia.org/wiki/Bridge_pattern) объясняет его в самых недвусмысленных терминах.

Шаблон стратегии - это динамический шаблон. Когда любая дикая функция может реализовать требования, используется шаблон стратегии. Примерами может быть любая программаэто позволяет разрабатывать и устанавливать плагины. На странице Википедии (http://en.wikipedia.org/wiki/Strategy_pattern), ConcreteStrategyAdd, ConcreteStrategySubtract и т. д. это плагин, используемый в классе ConcreteStrategy. Можно использовать любой метод, реализующий интерфейс Strategy.

...