2010-12-04 6 views
7

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

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

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

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

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

Я пропустил пункт здесь?

ответ

14

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

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

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

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

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

6

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

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

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

+0

Пример сделал ясно. – Sandbox 2010-12-04 18:49:44

0

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

0

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

  • декоратор изменяет кожу объекта

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

1

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