2014-10-17 2 views
35

Я просто натолкнулся на два шаблона.Шаблон стратегии V/S Decorator Pattern

  1. Стратегия Pattern

  2. декоратор

Стратегия Узор: -

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

декоратор: -

декоратор добавляет некоторую функциональность компонента.

На самом деле я обнаружил, что Стратегия Pattern и декоратор шаблон может также использоваться как взаимозаменяемые.

Вот ссылка: - When and How Strategy pattern can be applied instead of decorator pattern?

Какая разница между стратегией шаблоном и декоратором?

При использовании шаблона стратегии и при использовании шаблона декоратора?

Объясните разницу между обоими примерами.

ответ

59

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

Шаблон декоратора позволяет вам дополнять (или добавлять) существующие функциональные возможности с дополнительной функциональностью во время выполнения.

Основное различие заключается в изменения против увеличивающие

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

В качестве примера предположим, что вы пишете что-то, чтобы отсортировать коллекцию элементов. Таким образом, вы пишете интерфейс ISortingStrategy, после чего вы можете реализовать несколько различных стратегий сортировки BubbleSortStrategy, QuickSortStrategy, RadixSortStrategy, то ваше приложение, основанное на некоторых критериях существующего списка, выбирает наиболее подходящую стратегию для сортировки списка. Так, например, если в списке меньше 10 предметов, мы будем использовать RadixSortStrategy, если в списке было добавлено менее 10 элементов с последнего сортировки, мы будем использовать BubbleSortStrategy, иначе мы будем использовать QuickSortStrategy.

Мы меняем тип сортировки во время выполнения (чтобы быть более эффективным на основе дополнительной информации). Это шаблон стратегии.

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

Здесь мы добавляем новые функциональные возможности любой стратегии сортировки с помощью декоратора, но не выгрузив функциональность сортировки ядра (мы использовали различные стратегии, чтобы изменить это)

Вот пример того, как декораторы могут выглядеть так:

public interface ISortingStrategy 
{ 
    void Sort(IList<int> listToSort); 
} 

public class LoggingDecorator : ISortingStrategy 
{ 
    private ISortingStrategy decorated; 
    public LoggingDecorator(ISortingStrategy decorated) 
    { 
     this.decorated=decorated; 
    } 

    void Sort(IList<int> listToSort) 
    { 
     Log("sorting using the strategy: " + decorated.ToString(); 
     decorated.Sort(listToSort); 
    } 
} 

public class AuthorisingDecorator : ISortingStrategy 
{ 
    private ISortingStrategy decorated; 
    public AuthorisingDecorator(ISortingStrategy decorated) 
    { 
     this.decorated=decorated; 
    } 

    void Sort(IList<int> listToSort) 
    { 
     if (CurrentUserIsAdministrator()) 
     { 
      decorated.Sort(listToSort); 
     } 
     else 
     { 
      throw new UserNotAuthorizedException("Only administrators are allowed to sort"); 
     } 
    } 
} 
+0

Спасибо действительно хороший пример. –

+1

Для того, чтобы эти два класса были декораторами и чтобы клиентские вызовы были прозрачными (вызывая интерфейс 'ISortingStrategy'), они должны внедрять' ISortingStrategy', а также иметь его как зависимость –

+0

@kobac. Исправлена.Спасибо –

4

Стратегия - это шаблон, используемый для «инкапсуляции изменений». Он позволяет определять алгоритмы, которые можно переставлять во время выполнения. Например (пример, взятый из шаблонов проектирования First First):

Скажите, что у вас есть симулятор утки. Вы хотите, чтобы ваши объекты утки летали. Вы можете использовать наследование для этого, но оно быстро становится беспорядочным. Некоторые утки не могут летать (например, резиновые утки). Способ сделать это состоит в том, чтобы инкапсулировать, какие изменения, например, поведение мух в свой класс, которые реализуют IFlybehaviour, например. Затем вы можете использовать композицию вместо наследования и вводить IFlybehaviour в ваши объекты утки. Тогда вы также можете использовать метод, который устанавливает это поведение полета, поэтому поведение летучей мыши может быть изменено во время выполнения. Это по существу стратегия.

Шаблон декоратора используется для добавления функциональности к объекту во время выполнения. Он позволяет обертывать объекты внутри объектов. Декораторы должны иметь тот же супертип, что и предметы, которые они украшают. Это позволяет вам вызывать метод на «внешней оболочке», и вы можете затем вызвать этот же метод по слоям декораторов. Это в основном более гибкий подход, чем подклассы.

Что касается тех, которые вы выбираете, зависит от проблемы, которую вы хотите решить. Вы хотите иметь семейство альгорифмов, которые являются взаимозаменяемыми во время выполнения или вы хотите динамически добавлять дополнительные функции для объекта во время выполнения?

Книга «Head first design patterns» объясняет это довольно хорошо (возможно, намного лучше меня) IMO, поэтому стоит прочитать, если вы получите шанс.

Удачи.

+1

Я читаю ту же книгу. Я также нашел пример StarBuzz Coffee для рисунка декоратора. Но все же это создает путаницу. –

+0

Можете ли вы разработать узор Decorator больше, это главная запутанная часть? С некоторыми примерами программного кода? –

+0

Есть ли путаница из самих узоров или когда выбирать узор над другим? – Magrangs

0

Это сводится к следующему: используйте стратегию, чтобы выбрать один кусок функциональности ядра. Используйте Decorator для добавления дополнительных функций. Стратегия - это торт, который мы делаем, а Decorator - все прекрасные украшения, которые мы добавляем к нему.

7

Strategy_pattern

  1. Определяет семейство алгоритмов,
  2. Инкапсулирует каждый алгоритм, и
  3. Делает алгоритмы взаимозаменяемые в пределах этого семейства.

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

Decorator

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

Когда использовать:

  1. Добавить дополнительные функции/обязанности динамически
  2. Удалить функциональные возможности/обязанности динамически
  3. Избегайте слишком много суб-причислять добавить дополнительные обязанности.

Недостатки:

  1. Перерасхода Open Closed принцип (Open для расширения и закрытого для модификации). Используйте эту функцию экономно, где код наименее вероятен.
  2. Слишком много небольших классов и добавит накладные расходы на обслуживание.

Ключевые различия:

Стратегия позволяет изменить начинку объекта. Декоратор позволяет менять кожу.

Немного больше полезных сообщений:

When to Use the Decorator Pattern?

Real World Example of the Strategy Pattern

strategy по sourcemaking

0

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

+0

Стратегия - это образец инкапсуляции алгоритма. – YoungJeXu

Смежные вопросы