Подтвердить что ты не робот

Стратегия против моста

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

Стратегия

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

Пример 1: Сантехнические инструменты

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

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

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

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

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

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

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

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

Основное отличие (хотя оба шаблона имеют одинаковый 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();

Ответ 4

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

Ответ 5

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

Здесь вы можете найти примеры PHP мостов и стратегий:

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

и

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

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

Ответ 6

Стратегия:

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

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

  • Приложение использует только интерфейс стратегии. В зависимости от некоторого параметра конфигурации конкретная стратегия будет помечена интерфейсом.

Мост:

  • Это позволяет как абстракциям, так и реализациям меняться независимо.
  • Он использует состав над наследованием.
  • Мост - структурный шаблон.

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

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

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

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

В быстром примечании:

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

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

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

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

Ответ 7

Позвольте мне прочитать ответы из связанного вопроса.

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

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

Ответ 8

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

Мост:

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;
}