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

StackOverflow https://stackoverflow.com/questions/464524

Вопрос

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

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

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

Это было полезно?

Решение

Семантика.От Википедия:

Диаграмма класса UML для схемы стратегии совпадает с диаграммой для моста.Тем не менее, эти два шаблона дизайна не совпадают в своих намерениях.В то время как образец стратегии предназначен для поведения, мост предназначен для структуры.

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

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

Другие советы

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

Синтаксис аналогичен, но цели разные:

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

Стратегия:

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

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

Bridge : (структурный шаблон)

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

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

<Ол>
  • Абстракции и реализации не были определены во время компиляции
  • Абстракции и реализации должны быть изменены независимо
  • Изменения в реализации абстракции не должны влиять на приложение вызывающей стороны
  • Клиент должен быть изолирован от деталей реализации.
  • Стратегия (модель поведения)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Шаблон моста в 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()
    

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

      

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

         

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

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

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

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

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top