в c # в чем разница между паттерном стратегии и делегатами? - PullRequest
7 голосов
/ 09 февраля 2009

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 09 февраля 2009

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

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

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

2 голосов
/ 09 февраля 2009

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

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

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

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

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

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

0 голосов
/ 09 февраля 2009

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

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

0 голосов
/ 09 февраля 2009

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

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

0 голосов
/ 09 февраля 2009

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

...