2009-02-09 4 views
7

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

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

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

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

ответ

12

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

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

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

0

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

+1

Стратегический шаблон лучше реализовать с полиморфизмом. –

+1

Вы можете определить интерфейс и передать реализацию этого интерфейса. –

+1

Я использую интерфейсы для шаблона стратегии. –

0

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

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

+1

IMHO, Интерфейсы - более элегантный способ реализации этого шаблона. –

0

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

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

2

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

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

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

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

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

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

Смежные вопросы