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



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



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



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

1151   13  

13 ответов:

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

диаграмма классов 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 pattern отделяет абстракцию и реализацию и позволяет им меняться независимо.

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

  1. абстракции и реализации не были решены во время компиляции
  2. абстракции и реализации должны быть изменены самостоятельно
  3. изменения в реализации абстракции не должны влиять на приложение
  4. клиент должен быть изолирован от деталей реализации.

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

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

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

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

по теме:

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

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

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

Strategy VS Bridge

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

из вики о стратегия pattern

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

мост (структурных)

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

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

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

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

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

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

дополнительная информация:

Comments

    Ничего не найдено.