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

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

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

Есть ли более очевидная разница, которую я упускаю?

Я предполагаю, что связанный с этим вопрос будет: ЕСЛИ они похожи, в чем преимущество использования одного над другим?


person Community    schedule 09.02.2009    source источник


Ответы (6)


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

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

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

person David Morton    schedule 09.02.2009

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

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

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

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

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

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

person AwesomeTown    schedule 09.02.2009

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

person Autodidact    schedule 09.02.2009
comment
Шаблон стратегии лучше реализовать с помощью полиморфизма. - person Andrew Hare; 09.02.2009
comment
Вы можете определить интерфейс и передать реализацию этого интерфейса. - person AwesomeTown; 09.02.2009
comment
Я использую интерфейсы для шаблона стратегии. - person Gary Willoughby; 09.02.2009

Паттерны — это вопрос архитектуры. Делегаты — это вопрос реализации.

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

person Yes - that Jake.    schedule 09.02.2009
comment
ИМХО, интерфейсы - более элегантный способ реализации этого шаблона. - person Gary Willoughby; 09.02.2009

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

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

person Andrew Hare    schedule 09.02.2009

Делегаты можно увидеть похожими на функциональный интерфейс, используемый в Java — по сути, интерфейс только с одним методом.

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

Для поведения, которое можно охватить одним методом, выполнение стратегии является излишним и слишком многословным.

По сути, они решают одну и ту же задачу — вставить сменное поведение в класс.

person Tushar    schedule 16.05.2021