Подтвердить что ты не робот

Шаблон шаблона стратегии V/S

Я натолкнулся на два шаблона.

  • Шаблон стратегии

  • Decorator

Стратегия: -

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

Рисунок декоратора: -

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

Фактически я обнаружил, что шаблон Стратегия и Декоратор Шаблон также можно использовать взаимозаменяемо.

Вот ссылка: - Когда и как шаблон стратегии можно применить вместо шаблона декоратора?

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

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

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

4b9b3361

Ответ 1

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

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

Ключевое различие заключается в изменении vs augment

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

В качестве примера представьте, что вы пишете что-то, чтобы отсортировать коллекцию элементов. Таким образом, вы пишете интерфейс 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");
         }
    }
}

Ответ 2

Strategy_pattern

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

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

Decorator

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

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

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

Недостатки:

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

Основные различия:

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

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

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

Реальный мир Пример шаблона стратегии

strategy с помощью sourcemaking

Ответ 3

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

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

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

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

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

Удачи.

Ответ 4

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