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

Я рассматривал примеры реализации шаблона стратегии, и мне кажется, что они очень похожи на делегатов c#. Единственное различие, которое я вижу, заключается в том, что реализации шаблона стратегии не нужно явно объявлять делегат.

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

есть более очевидная разница, что я не хватает?

Я думаю, вопрос будет, если они похожи, то в чем преимущество использования одного над другим?

5 ответов


проще говоря, вы можете использовать делегаты для реализации паттерна Стратегия.

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

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


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

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

альтернативным решением является определение интерфейса, такого как:

public interface IStrategy
{
    void DoStuff(...)
}

стратегии затем будут представлены классами, реализующими этот интерфейс, а не a делегат.

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


как еще вы могли бы реализовать шаблон стратегии в C#?


Шаблоны-это вопрос архитектуры. Делегаты - это вопрос осуществления.

в C# шаблон стратегии почти всегда будет реализован с использованием делегата.


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

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