В чем разница между моделью моста и стратегией?
Я пытался прочитать много статей о dofactory, Википедии и многих сайтах. Я понятия не имею о различиях между шаблоном моста и шаблоном стратегии.
Я знаю, что оба они отделяют абстракцию от ее реализации и могут изменять реализацию во время выполнения.
но я все еще не знаю, в какой ситуации я должен использовать стратегию или в какой ситуации я должен использовать мост.
13 ответов
семантика. От Википедия:
диаграмма классов UML для стратегии шаблон такой же, как диаграмма для узор моста. Однако эти двое шаблоны дизайна не одинаковы в их намерение. Пока стратегия шаблон предназначен для поведения, Шаблон моста предназначен для структуры.
связь между контекстом и стратегии более жесткие, чем связь между абстракцией и этот внедрение в мост узор.
Как я понимаю, вы используете шаблон стратегии, когда вы абстрагируете поведение, которое может быть предоставлено из внешнего источника (например. config может указать, чтобы загрузить некоторую сборку плагина), и вы используете шаблон моста, когда используете те же конструкции, чтобы сделать ваш код немного аккуратнее. Фактический код будет выглядеть очень похожим - вы просто применяете шаблоны по несколько другим причинам.
шаблон моста является структурным шаблоном (как вы строите программный компонент?). Шаблон стратегии-это динамический шаблон (как вы хотите запустить поведение в программном обеспечении?).
синтаксис похож, но цели разные:
- стратегия: у вас есть больше способов для выполнения операции; со стратегией вы можете выбрать алгоритм во время выполнения, и вы можете изменить одну стратегию без большого количества побочных эффектов на время компиляции;
- мост: вы можете разделить иерархию интерфейса и класса, присоединиться к ней с абстрактной ссылкой (см. экспликации)
стратегия:
- контекст, связанный со стратегией: класс контекста (возможно, абстрактный, но не совсем интерфейс! поскольку u хочет инкапсулировать определенное поведение, а не всю реализацию) будет знать / содержать ссылку на интерфейс стратегии и реализация чтобы вызвать поведение стратегии на нем.
-
намерение-это способность менять поведение в время работы
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(); } ............. }
мост: ( структурным узором)
шаблон моста отделяет абстракцию и реализацию и позволяет им варьироваться независимо.
используйте этот шаблон, если :
- абстракции и реализации не были решены во время компиляции
- абстракции и реализации должны быть изменены самостоятельно
- изменения в реализации абстракции не должны affect caller application
- клиент должен быть изолирован от деталей реализации.
стратегия: ( поведенческий паттерн)
Шаблоны стратегий позволяют переключаться между несколькими алгоритмами из семейства алгоритмов во время выполнения.
используйте шаблон стратегии, когда:
- требуется несколько версий алгоритмов
- поведение класса динамически изменяться во время выполнения
- избегать условных операторов
по теме:
когда вы используете шаблон мост? Чем он отличается от шаблона адаптера?
Я думал то же самое, но недавно мне пришлось использовать bridge и понял, что bridge использует стратегию и добавляет абстракцию в контекст, чтобы позже вы могли вносить больше изменений без изменения клиента. При использовании стратегии без абстракции дизайн не столь гибок и может потребовать внесения изменений в клиента позже. Но при использовании всего моста конструкция становится еще более гибкой. Здесь вы можете увидеть, как переход от стратегии к мосту дает больше гибкости. Также мы предполагаем что теперь "visa" и "master" доступны не только на картах, но и на телефонах и чипах; и если мы используем bridge, гораздо проще добавить эту поддержку.
добавление к ответу willcodejavaforfood, они могут быть одинаковыми, в реализации. Однако вы используете стратегию для обмена стратегиями, такими как стратегия сортировки, в то время как вы используете bridge для объединения реализаций двух объектов, скажем, оболочки базы данных и сетевого адаптера, чтобы клиентский код мог использовать либо работу с тем же API. Поэтому называя фактически все сказано
из вики о стратегия шаблон
диаграмма классов UML для стратегии шаблон такой же, как диаграмма для узор моста. Однако эти двое шаблоны дизайна не одинаковы в их намерение. Пока стратегия шаблон предназначен для поведения, Шаблон моста предназначен для структуры.
связь между контекстом и стратегии более жесткие, чем связь между абстракцией и этот внедрение в мост узор.
просто добавить к тому, что уже было сказано о сравнении рисунка (разница в намерениях ...): шаблон моста также намеренно структурирован, чтобы позволить стороне иерархии абстракции изменяться. В таких языках, как C#, это может означать, что у вас есть база абстракций, содержащая виртуальные методы, чтобы разрешить предполагаемые изменения, которые не вызывают проблем для существующих потребителей. Кроме того, эти два паттерна могут показаться идентичными по большей части.
шаблон стратегии используется, когда вы хотите подключить алгоритм или стратегию во время выполнения. Поскольку категория шаблона также подразумевает, что она имеет дело с поведением объектов. С другой стороны, мост является структурным шаблоном и имеет дело со структурной иерархией объектов. Он отделяет абстракцию от реализации, вводя между ними уточненную абстракцию. Уточненную абстракцию можно спутать с подключенной стратегией времени выполнения (в шаблоне стратегии). Мост pattern имеет дело с структурные аспекты, предоставляя механизм, позволяющий избежать создания n классов.
стратегия шаблон используется для поведенческих решений, в то время как мост шаблон используется для структурных решений.
до шаблон отделяет абстрактные элементы от деталей реализации, в то время как стратегия Pattern обеспокоен тем, что алгоритмы более взаимозаменяемы.
шаблон стратегии в 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()
для шаблона стратегии только реализация варьируется.
предположим, класс A использует класс B, который имеет несколько доступных реализаций. Поэтому в этом случае B будет абстрактным с фактической реализацией, предоставляемой во время выполнения. Это стратегия pattern
теперь, если сам по себе является абстрактным. И A, и B могут различаться. Вы бы использовали шаблон моста.
Я думаю, что есть небольшая разница между ними в контексте они используются.
Я использую шаблон моста для разделения ортогональных понятий, которые они оба принадлежат к большему - чтобы позволить им варьироваться независимо. Обычно она включает в себя несколько абстракций.
IMO, шаблон стратегии проще или более плоский. Он служит для OCP наверняка, но не обязательно является частью другой и большей концепции, такой как шаблон моста.
типы шаблонов проектирования
- поведенческие: шаблоны характеризуют способы взаимодействия классов или объектов и распределения ответственности
- структурные: шаблоны имеют дело с составом классов или объектов.
- Creational: шаблоны касаются процесса создания объектов.
мост (структурных)
отделить абстракцию от ее реализации так, что каждый может измениться. независимо.
возьмите пульт дистанционного. Пульт имеет кнопки 1-6. Это конкретный класс на диаграмме выше. Каждая кнопка будет работать по-разному в зависимости от того, используется ли пульт для телевизора или DVD. Функциональность для каждой кнопки абстрагируется от реализации интерфейсом реализатора.
Это позволяет нам изменять как пульт будет работать для каждого устройства.
стратегия (поведенческий)
определения семейства алгоритмов , инкапсуляции каждого из них и делает их взаимозаменяемыми.
в стратегии, если бы мы смотрели на удаленный сценарий. "Состояние" - это весь пульт, который мы меняем, изменяя ссылку на состояние контекста. В "concreteStateA" (пульт) "concreteStateB" (DVD-диск Удаленный.)
дополнительная информация: