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


114

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

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

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

Ответы:


66

Семантика. Из википедии :

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

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

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


3
Так что могу сказать, что я использую шаблон стратегии, чтобы иметь возможность абстрагироваться от поведения, а также сделать код более аккуратным, как в шаблоне моста ... или я использую шаблон моста, чтобы сделать код более аккуратным, а также потому, что он позволяет мне абстрагироваться от поведения, как в шаблоне стратегии? и был бы я прав?
user20358

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

3
В моем экземпляре книги GoF язык UML моста совершенно другой . Этот инструмент может отличить Мост от Стратегии.
Fuhrmanator 08

1
Википедия часто является ужасной ссылкой. Справедливо, что дезинформация была удалена со страницы. en.wikipedia.org/w/…
Fuhrmanator 08

2
Я понимаю, что один и тот же метод используется для абстрагирования реализации (стратегии) ​​или абстрагирования интерфейса (моста). Поведение подкачки стратегии, интерфейсы подмены мостов (это в конечном итоге позволяет заменять реализации с такими интерфейсами). Другими словами, Bridge создает стандартизированный интерфейс с одной стороны и подключает реализации с разными интерфейсами с другой.
Nikaas

55

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

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

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

3
поэтому, если синтаксис подобен, будет ли я прав, говоря, что я использую любой из этих шаблонов для запуска поведения программного обеспечения определенным образом, а также потому, что я хочу создать компонент таким образом, чтобы он также выглядел аккуратно?
user20358

11

Стратегия:

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

    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();
    
          }
    
          .............
    
    }
    

10

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

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


9

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

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

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

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

Стратегия: (Образец поведения)

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

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

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

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

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

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


4

Типы шаблонов проектирования

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

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

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

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

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

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

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

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

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


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

  2. Brigde Pattern отделяет абстрактные элементы от деталей реализации, в то время как Strategy Pattern заботится о том, чтобы алгоритмы были более взаимозаменяемыми.

Шаблон стратегии в 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()

почему только один шаблон стратегии более "взаимозаменяемый". Так как мы кода на интерфейс, а не реализации, мы можем поменять местами реализации в стратегии, или мост, как вы продемонстрировали в вашем примере кода, обмен Stereoс TVи код просто работает.
denis631

2

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


1

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

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

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


Не могли бы вы уточнить последнюю фразу?
gstackoverflow

1

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


1

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


1

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

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

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


0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.