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

Я пытался прочитать много статей на dofactory, на Википедии и на многих сайтах. Я понятия не имею о различиях между паттерном моста и паттерном стратегии.

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

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


person Krirk    schedule 21.01.2009    source источник


Ответы (14)


Семантика. Из wikipedia:

Диаграмма классов UML для шаблона Стратегия такая же, как диаграмма для шаблона Мост. Однако эти два шаблона проектирования не совпадают по своему назначению. В то время как шаблон «Стратегия» предназначен для поведения, шаблон «Мост» предназначен для построения структуры.

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

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

person Kent Boogaart    schedule 21.01.2009
comment
поэтому могу я сказать, что я использую шаблон стратегии, чтобы иметь возможность абстрагироваться от поведения, а также сделать код более аккуратным, как в шаблоне моста ... или я использую шаблон моста, чтобы сделать код более аккуратным, а также потому, что он позволяет мне абстрагироваться от поведения, как в шаблоне стратегии? и был бы я прав? - person user20358; 08.02.2012
comment
Разница между ними только в их предназначении. Итак, я думаю, мы могли бы с уверенностью сказать, что, поскольку оба они используют одну и ту же идею и предлагают одинаковую гибкость, эти два шаблона функционально одинаковы. - person Elz; 04.09.2015
comment
моста UML достаточно <б> разные в моем экземпляре книги GoF. Этот инструмент может отличить мост от стратегии. - person Fuhrmanator; 08.08.2016
comment
Википедия часто является ужасной ссылкой. Справедливо, что дезинформация была удалена со страницы. en.wikipedia.org/w/ - person Fuhrmanator; 08.08.2016
comment
Стоит отметить, что хотя шаблон стратегии обрабатывает одну функцию, которую можно заменить во время выполнения, шаблон моста может иметь несколько функций, которые каждый класс переопределяет по-разному. т.е. Интерфейс устройства с методами включения и выключения - вы решаете это с помощью шаблона Bridge - person TheLogicGuy; 23.01.2018
comment
Я понимаю, что один и тот же метод используется для абстрагирования реализации (стратегии) ​​или абстрагирования интерфейса (моста). Поведение подкачки стратегии, интерфейсы подкачки мостов (это в конечном итоге позволяет обмениваться реализациями с такими интерфейсами). Другими словами, Bridge создает стандартизированный интерфейс с одной стороны и подключает реализации с разными интерфейсами с другой. - person Nikaas; 17.02.2018

Паттерн Мост - это структурный паттерн (КАК СОЗДАТЬ ПРОГРАММНЫЙ КОМПОНЕНТ?). Паттерн Стратегия - это динамический паттерн (КАК ВЫ ХОТИТЕ ИСПОЛЬЗОВАТЬ ПОВЕДЕНИЕ В ПРОГРАММНОМ ОБЕСПЕЧЕНИИ?).

Синтаксис похож, но цели разные:

  • Стратегия: у вас есть больше возможностей для выполнения операции; с помощью стратегии вы можете выбрать алгоритм во время выполнения, и вы можете изменить одну стратегию без множества побочных эффектов во время компиляции;
  • Мост: вы можете разделить иерархию интерфейса и класса, объединить ее абстрактной ссылкой (см. объяснение)
person alepuzio    schedule 21.01.2009
comment
поэтому, если синтаксис подобен, будет ли я прав, говоря, что я использую любой из этих шаблонов для запуска поведения программного обеспечения определенным образом, а также потому, что я хочу построить компонент таким образом, чтобы он также выглядел аккуратно? - person user20358; 08.02.2012

Стратегия:

  • Контекст, связанный со стратегией: класс контекста (возможно, абстрактный, но на самом деле не интерфейс! Поскольку вы хотите инкапсулировать конкретное поведение, а не всю реализацию) будет знать / содержать ссылку на интерфейс стратегии и реализацию вызвать на нем стратегию поведения.
  • Намерение - это возможность менять поведение во время выполнения

    class Context {
    
         IStrategy strategyReference;
    
         void strategicBehaviour() {
    
            strategyReference.behave();
         }
    
    }
    

Мост

  • Абстракция, не привязанная к реализации: интерфейс абстракции (или абстрактный класс с большей частью абстрактного поведения) не будет знать / содержать ссылку на интерфейс реализации.
  • Намерение состоит в том, чтобы полностью отделить абстракцию от реализации.

    interface IAbstraction {
    
        void behaviour1();
    
        .....
    
    }
    
    interface IImplementation {
    
         void behave1();
    
         void behave2();
    
         .....
    
    }
    
    class ConcreteAbstraction1 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationA() // Some implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave1();
    
          }
    
          .............
    
    }
    
    class ConcreteAbstraction2 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationB() // Some Other implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave2();
    
          }
    
          .............
    
    }
    
person MEER    schedule 27.07.2011

Я думал то же самое, но недавно мне пришлось использовать мост и понял, что мост использует стратегию и добавляет абстракцию в контекст, чтобы позже вы могли вносить больше изменений, не меняя клиента. При использовании стратегии без абстракции дизайн не такой гибкий и может потребовать изменений в клиент позже. Но при использовании всего моста конструкция становится еще более гибкой. Здесь вы можете увидеть, как переход от стратегии к мосту дает больше гибкости. Также мы предполагаем, что теперь «виза» и «мастер» доступны не только на картах, но и на телефонах и чипах; и если мы используем мост, гораздо проще добавить эту поддержку.

Стратегия VS Мост

person Orhan    schedule 03.09.2016

Мост: (структурный образец)

Шаблон моста разделяет абстракцию и реализацию и позволяет обоим варьироваться независимо.

Используйте этот шаблон, когда:

  1. Абстракции и реализации не были определены во время компиляции
  2. Абстракции и реализации следует менять независимо
  3. Изменения в реализации абстракции не должны влиять на вызывающее приложение.
  4. Клиент должен быть изолирован от деталей реализации.

Стратегия (поведенческий шаблон)

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

Используйте шаблон стратегии, когда:

  1. Требуется несколько версий алгоритмов
  2. Поведение класса должно динамически изменяться во время выполнения.
  3. Избегайте условных утверждений

Похожие сообщения:

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

Пример шаблона стратегии в реальном мире

person Ravindra babu    schedule 17.02.2016

Типы шаблонов дизайна

  • Поведенческие: шаблоны характеризуют способы взаимодействия классов или объектов и распределения ответственности.
  • Структурные: шаблоны связаны с составом классов или объектов.
  • Создание: паттерны связаны с процессом создания объекта.

Мост (структурный)

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

Возьми пульт. На пульте есть кнопки 1-6. Это конкретный класс на диаграмме выше. Каждая кнопка будет работать по-разному в зависимости от того, используется ли пульт для телевизора или DVD. Функциональность каждой кнопки абстрагируется от реализации интерфейсом разработчика.

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

Стратегия (поведенческая)

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

В стратегии, если бы мы смотрели на удаленный сценарий. «Состояние» - это весь пульт, который мы заменяем, изменяя ссылку на состояние контекста. «ConcreteStateA» (пульт от телевизора) «ConcreteStateB» (пульт DVD).

Дополнительное чтение:

person Daniel    schedule 09.05.2018

  1. Шаблон Стратегия используется для поведенческих решений, а шаблон Мост используется для структурных решений.

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

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

Шаблон Brigde в UML

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

protocol PrintStrategy {
   func print(_ string: String) -> String
}

class Printer {
   let strategy: PrintStrategy

   init(strategy: PrintStrategy) {
      self.strategy = strategy
    }

  func print(_ string: String) -> String {
     return self.strategy.print(string)
  }
}

class UpperCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.uppercased()
    }
}

class LowerCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.lowercased()
    }
}

var lower = Printer(strategy: LowerCaseStrategy())
lower.print("I love Software Patterns")

var upper = Printer(strategy: UpperCaseStrategy())
upper.print("I love Software Patterns")

Узор Brigde в Swift:

protocol Appliance {
   func run()
}

protocol Switch {
   let appliance: Appliance {get set}
   func turnOn()
}

class RemoteControl: Switch {
   var appliance: Appliance

   init(appliance: Appliance) {
       self.appliance = appliance
   }

   internal func turnOn() {
      appliance.run()
   }
}

class TV: Appliance {
   internal func run() {
      print("TV is ON")
   }
}

class Stereo: Appliance {
   internal func run() {
      print("Stereo is ON")
   }
}

var tvRemote = RemoteControl.init(appliance: TV())
tvRemote.turnOn()

var stereoRemote = RemoteControl.init(appliance: Stereo())
stereoRemote.turnOn()
person Joan Disho    schedule 18.02.2017
comment
почему только паттерн стратегии более взаимозаменяемый. Поскольку мы кодируем интерфейс, а не реализацию, мы можем поменять местами реализации в стратегии или мосте, как вы продемонстрировали в своем примере кода, заменив Stereo на TV, и код просто работает. - person denis631; 25.12.2019

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

person Robert Gould    schedule 21.01.2009

Для шаблона стратегии варьируется только реализация.

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

Теперь, если само A абстрактно. И A, и B могут отличаться. Вы бы использовали паттерн Мост.

person Ritesh Tyagi    schedule 09.06.2017

Из вики по шаблону Стратегия

Диаграмма классов UML для шаблона Стратегия такая же, как диаграмма для шаблона Мост. Однако эти два шаблона проектирования не совпадают по своему назначению. В то время как шаблон «Стратегия» предназначен для поведения, шаблон «Мост» предназначен для построения структуры.

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

person willcodejavaforfood    schedule 21.01.2009
comment
Не могли бы вы уточнить последнюю фразу? - person gstackoverflow; 13.06.2019

Просто чтобы добавить к тому, что уже было сказано о сравнении паттернов (различие намерений, ...): паттерн Мост также намеренно структурирован, чтобы позволить варьировать сторону иерархии абстракции. В таких языках, как C #, это может означать, что у вас есть база абстракции, которая содержит виртуальные методы как способ разрешить предполагаемые варианты, которые не вызывают проблем для существующих потребителей. В остальном эти два шаблона могут по большей части казаться идентичными.

person Burt    schedule 11.04.2011

Шаблон стратегии используется, когда вы хотите подключить алгоритм или стратегию во время выполнения. Поскольку категория паттерна также подразумевает, что она имеет дело с поведением объектов. С другой стороны, мост представляет собой структурный образец и имеет дело со структурной иерархией объектов. Он отделяет абстракцию от реализации, вводя между ними усовершенствованную абстракцию. Уточненную абстракцию можно спутать с подключенной стратегией времени выполнения (шаблон In Strategy). Шаблон «мост» имеет дело со структурными аспектами, предоставляя механизм, позволяющий избежать создания n классов.

person Pranav Sharma    schedule 22.10.2013

Я думаю, между ними есть небольшая разница в контексте их использования.

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

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

person stdout    schedule 08.09.2017

В шаблоне стратегии действия Родителя для конкретной операции постоянны, тогда как действия Дитя могут варьироваться. Однако в паттерне «Мост» действия как Родителя, так и Дитя могут различаться.

Так, например,

public class Ticket {
    
    Date dateOfTravel;
    int distance;
    Vehicle vehicle;
    Seat  seat;
    
    public float getTotalFare(){
         //depends on 
               //Distance
               //Vehicle - whether Vehicle is AC or non-AC. 
               //Seat - based on the location of the Seat.
     
        //Fare = vehicleBaseFare*seatMultiplier*distance

    }
    
}

В приведенном выше примере варианты зависят от Родителя (расстояние), а также от детей (Транспортное средство и Сиденье). Итак, здесь и Vehicle, и Seat действуют как Bridge.

Вот здесь

public class Vehicle {

   TrackingDevice device;

   public Coordinates getCoordinates(){
       return device.getCoordinates();
   }
}

Здесь роль Родителя была постоянной, т.е. ничего! Итак, это был паттерн Стратегии.

person Viplove Dev    schedule 16.11.2020