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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Стратегия:

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

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

Ответ 4

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

Мост-шаблон отделяет абстрагирование и реализацию и позволяет обойтись независимо.

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

  • Абстракции и реализации не были определены во время компиляции.
  • Абстракции и реализации должны быть изменены независимо.
  • Изменения в реализации абстракции не должны влиять на приложение-получатель
  • Клиент должен быть изолирован от деталей реализации.

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

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

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

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

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

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

Реальный мир Пример шаблона стратегии

Ответ 5

Из wiki на Strategy pattern

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

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

Ответ 6

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

Ответ 7

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

Стратегия VS Bridge

Ответ 8

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

Ответ 9

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

Ответ 10

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

  • 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()

Ответ 11

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

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

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

Ответ 12

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

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

IMO, шаблон стратегии более простой или более плоский. Он служит для OCP точно, но не обязательно должен быть частью другой и более крупной концепции, такой как шаблон Bridge.