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

Разница между шаблоном стратегии и шаблоном делегирования

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

4b9b3361

Ответ 1

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

  • интерфейс под названием "Стратегия" (или со Стратегией как часть имени). этот интерфейс должен иметь метод, называемый execute().
  • один или несколько конкретных классов, называемых ConcreteStrategyA, ConcreteStrategyB и т.д., которые реализуют интерфейс Strategy.
  • должен быть также класс контекста, содержащий Стратегию

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

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

Ответ 2

"Делегирование" на самом деле не является шаблоном проектирования, это скорее общий метод программирования, когда компонент A делегирует задачу (независимо от задачи, которая может быть) для компонента B. Делегирование может использоваться во многих контекстах.

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

Например, вы можете реализовать шаблон стратегии и вызвать его с помощью

strategy.execute(x)

Шаблон стратегии включает в себя различные реализации интерфейса вашей стратегии и выбор соответствующей реализации во время выполнения. Актом вызова этой реализации является делегирование.

Таким образом, он не является ни/или, понятия бесплатны.

Ответ 3

Вот мысль:

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

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

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

Ответ 4

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

Я действительно нашел эту страницу, чтобы кто-то мог рассказать мне о преимуществах использования маршрута шаблона проектирования, учитывая, что как java 8, так и С# теперь поддерживают функции передачи в качестве аргументов