В чем разница между паттерном моста и паттерном стратегии?
-
19-08-2019 - |
Вопрос
Я пытался прочитать много статей о дофабрика, Википедия и множество сайтов.Я понятия не имею о различиях между шаблоном моста и шаблоном стратегии.
Я знаю, что оба они отделяют абстракцию от ее реализации и могут изменять реализацию во время выполнения.
Но я до сих пор не знаю, в какой ситуации мне следует использовать стратегию, а в какой — бридж.
Решение
Семантика.От Википедия:
Диаграмма класса 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 " доступны не только на картах, но и на телефонах и чипах; и если мы используем мост, гораздо проще добавить эту поддержку.
Типы шаблонов проектирования
- Поведенческий: шаблоны характеризуют способы взаимодействия классов или объектов и распределения ответственности.
- Структурный: шаблоны имеют дело с композицией классов или объектов.
- Творческий: шаблоны касаются процесса создания объектов.
Мост (Структурный)
Отделите абстракцию от ее реализации, чтобы каждая из них могла различаться.независимо.
Возьмите пульт.На пульте есть кнопки 1-6.Это конкретный класс на диаграмме выше.Каждая кнопка будет работать по-разному в зависимости от того, используется ли пульт для телевизора или DVD.Функциональность каждой кнопки абстрагируется от реализации интерфейса разработчика.
Это позволяет нам изменить способ работы пульта для каждого устройства.
Стратегия (Поведенческий)
Определите семейство алгоритмов, инкапсулируйте каждый из них и сделайте их взаимозаменяемыми.
В стратегии, если рассматривать удаленный сценарий.«Состояние» — это весь удаленный объект, который мы заменяем, изменяя ссылку на состояние контекста.«concreteStateA» (пульт ТВ) «concreteStateB» (пульт DVD).
Дополнительное чтение:
Добавляя к ответу willcodejavaforfood, они могут быть одинаковыми в реализации. Однако вы используете стратегию для обмена стратегиями, такими как стратегия сортировки, в то время как вы используете мост для объединения реализаций двух объектов, скажем, обертки базы данных, и сетевого адаптера, чтобы клиентский код мог использовать любой из них, работающий против одного и того же API. Таким образом, наименование говорит само за себя
Стратегия используется для поведенческих решений, а шаблон Мост используется для структурных решений.
Brigde отделяет абстрактные элементы от деталей реализации, тогда как шаблон Стратегия заинтересован в том, чтобы сделать алгоритмы более взаимозаменяемыми.
Шаблон стратегии в 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.