Когда и как шаблон стратегии может быть применен вместо шаблона декоратора? - PullRequest
9 голосов
/ 04 декабря 2010

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

".., увеличив число стратегий от одной до открытый список, мы достигаем того же эффекта, что и вложенные декораторы рекурсивно. "

Я не совсем понял это утверждение.

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

Принимая во внимание, что декораторы не совсем независимы от клиентов, которых они украшают. Фактически, они имеют тот же супертип, что и объект, который они украшают.

Я что, упускаю здесь точку?

Ответы [ 5 ]

14 голосов
/ 04 декабря 2010

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

Стратегии являются лучшим выбором в ситуациях, когда класс Component по своей природе тяжелый, что делает шаблон Decorator слишком дорогостоящим для применения. В шаблоне «Стратегия» компонент перенаправляет часть своего поведения на отдельный объект стратегии. Шаблон Стратегии позволяет нам изменять или расширять функциональность компонента путем замены объекта стратегии.

Например, мы можем поддерживать разные стили границ, если компонент отложить рисование границ для отдельного объекта Border. Объект Border - это объект Strategy, который инкапсулирует стратегию рисования границ. Расширяя число стратегий от одной до открытого списка, мы достигаем того же эффекта, что и рекурсивное вложение декораторов.

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

Вы правы, что стратегии, как правило, более независимы от основного компонента, чем декораторы, но они могут знать об этом компоненте. А чтобы использовать шаблон «Стратегия», основной компонент должен знать о существовании стратегий, когда в Decorator это не требуется.

6 голосов
/ 04 декабря 2010

Чтобы использовать их пример, у вас может быть класс окна, который можно прокручивать и / или окрашивать его границы различными способами (или не рисовать вовсе).Если бы вы использовали наследование для охвата всех этих функций, вам понадобился бы один подкласс для каждой возможной комбинации функций (без рамки, без прокрутки, без рамки, без прокрутки, без рамки, рамки и прокрутки и т. Д.).Это негибкий кошмар обслуживания, так как вы добавляете больше функций, потому что количество классов резко увеличивается.

Главное, что они здесь делают, это то, что вы можете использовать либо шаблон стратегии, либо шаблон декоратора, чтобы лучшерешить эту проблему.У вас может быть класс Window, который инкапсулирует объект стратегии прокрутки и объект стратегии границы.Или вы можете взять свой объект Window, обернуть его внутри граничного декоратора и обернуть его внутри прокручиваемого декоратора.

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

1 голос
/ 11 июня 2013

, если вы хотите использовать несколько подходов к чему-либо, используйте шаблон стратегии.Если вы хотите создать что-то, где определенные вещи могут или не могут быть использованы для изменения объекта / компонента / чего бы то ни было, тогда вы должны использовать декоратор.другими словами, можно также сказать, что декоратор, вероятно, добавляет функциональность (украшает) объект, а стратегия, вероятно, меняет функциональность.

0 голосов
/ 17 апреля 2013

Шаблон стратегии можно применять, когда для вас важна личность Объекта.Идентичность объекта сохраняется независимо от того, сколько стратегий применено, но для шаблона Decorator. Объекты, инкапсулированные друг в друге, при преобразовании будут потеряны исходные идентификаторы

  • Шаблон Decorator изменяет скин объекта.

  • Шаблон стратегии изменяет внутренности объекта.

0 голосов
/ 04 декабря 2010

Различие состоит в том, что в шаблоне Стратегия один объект Стратегии может использоваться для одновременного предоставления информации в Контекст. С помощью Decorator вы можете размещать стратегии друг над другом и, таким образом, иметь так называемые «открытые» числа.

...