В чем разница между образцом моста и образцом стратегии? - PullRequest
107 голосов
/ 21 января 2009

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

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

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

Ответы [ 13 ]

62 голосов
/ 21 января 2009

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

Диаграмма классов UML для Стратегии шаблон такой же, как диаграмма для Образец Моста. Тем не менее, эти два шаблоны проектирования не одинаковы в их намерение. Пока стратегия шаблон предназначен для поведения, Шаблон моста предназначен для конструкции.

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

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

53 голосов
/ 21 января 2009

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

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

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

Стратегия:

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

    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();
    
          }
    
          .............
    
    }
    
7 голосов
/ 17 февраля 2016

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

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

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

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

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

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

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

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

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

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

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

5 голосов
/ 03 сентября 2016

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

Strategy VS Bridge

2 голосов
/ 10 мая 2018

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 18 февраля 2017
  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")

Бригадный паттерн в 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()
2 голосов
/ 21 января 2009

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

1 голос
/ 22 октября 2013

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

1 голос
/ 11 апреля 2011

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

...