В чем разница между шаблоном стратегии и шаблоном делегирования (не делегатами)?
Разница между шаблоном стратегии и шаблоном делегирования
Ответ 1
шаблон стратегии - это очень специфическое дизайнерское решение для общей проблемы программного обеспечения. шаблон стратегии подразумевает, что будет
- интерфейс под названием "Стратегия" (или со Стратегией как часть имени). этот интерфейс должен иметь метод, называемый execute().
- один или несколько конкретных классов, называемых ConcreteStrategyA, ConcreteStrategyB и т.д., которые реализуют интерфейс Strategy.
- должен быть также класс контекста, содержащий Стратегию
делегирование - скорее принцип, чем шаблон. Делегация подразумевает, что вместо того, чтобы один объект отвечал за все, он делегирует ответственность другим объектам. причина, по которой это общепринятая техника, заключается в том, что она обеспечивает еще два фундаментальных принципа разработки программного обеспечения за счет уменьшения связи и повышения сплоченности.
Сказав все это, не беспокойтесь о шаблонах. Сосредоточьтесь на принципах, и если вы почувствуете, что ваше решение может быть улучшено - посмотрите на шаблоны, чтобы увидеть, есть ли лучшая мышеловка. Если вы сосредоточитесь на шаблонах, а не на принципах, вы потеряете себя во всех шаблонах и внедряете шаблоны для реализации шаблонов...
Ответ 2
"Делегирование" на самом деле не является шаблоном проектирования, это скорее общий метод программирования, когда компонент A делегирует задачу (независимо от задачи, которая может быть) для компонента B. Делегирование может использоваться во многих контекстах.
Шаблон стратегии, с другой стороны, представляет собой конкретный шаблон, который обычно использует большое количество делегирования в качестве детали реализации.
Например, вы можете реализовать шаблон стратегии и вызвать его с помощью
strategy.execute(x)
Шаблон стратегии включает в себя различные реализации интерфейса вашей стратегии и выбор соответствующей реализации во время выполнения. Актом вызова этой реализации является делегирование.
Таким образом, он не является ни/или, понятия бесплатны.
Ответ 3
Вот мысль:
Делегаты имитируют делегирующий класс (по крайней мере, как я их использовал, не уверен, что это канонический путь или нет, но как я обычно это делаю). В принципе, если у меня есть класс, который имеет несколько точек входа (методы), и я хочу изменить реализацию во время выполнения, я бы создал делегатов для реализации того же интерфейса.
Если, с другой стороны, у меня была одна часть класса, которую я хочу обменять во время выполнения, я бы создал классы стратегий с помощью одного интерфейса метода (например, executeCalculation) и сделал бы его совокупным компонентом содержащий класс.
Итак, в целом стратегия включает в себя одно поведение, делегаты реализуют набор поведений, и вы можете использовать делегатов для реализации стратегий.
Ответ 4
если вы имели в виду стратегический шаблон против делегатов, как в функциях /lambdas, переданных в качестве аргументов, то, по крайней мере, я знаю, что в классах меньше затрат, которые нужно компилировать для делегатов.
Я действительно нашел эту страницу, чтобы кто-то мог рассказать мне о преимуществах использования маршрута шаблона проектирования, учитывая, что как java 8, так и С# теперь поддерживают функции передачи в качестве аргументов