在c#战略模式和代表之间有什么区别?

时间:2009-02-09 19:31:36

标签: c# delegates strategy-pattern

我一直在研究策略模式实现示例,在我看来它们与c#delegates非常相似。我看到的唯一区别是策略模式实现不需要显式声明委托。

但除此之外,它们似乎都指向需要特定签名的函数,它们都可用于确定在运行时执行的内容。

我缺少一个更明显的区别吗?

我猜一个相关的问题是,如果他们相似,那么使用一个优于另一个的优势是什么?

6 个答案:

答案 0 :(得分:13)

简而言之,您可以使用委托来实施战略模式。

策略模式是一种模式。代表是一种语言功能。您可以使用语言功能来实现模式。它们完全存在于两个不同的概念类别中,但它们之间的相互作用是相关的。

换句话说,战略模式是蓝图,C#代表是砖块。没有任何一个,你无法建立(策略模式)房子。 (您也可以使用其他类型的砖来构建它,但代理的语言功能中没有任何内容本身描述策略模式)。

答案 1 :(得分:2)

设计模式是与语言无关的常见问题的高级解决方案。

代理可以在.NET的策略模式的特定于平台的实现中使用,但不是实现此类解决方案的唯一方法。

另一种解决方案是定义如下界面:

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

策略将由实现此接口的类表示,而不是由委托表示。

如果您希望您的策略非常简单,那么代表可能是一个好的实现。对于任何相当复杂的事情,在跟踪状态,将事物组织成多种方法,在实现之间共享代码等方面,将接口实施为接口可以提供更多选择。

答案 2 :(得分:0)

您如何在C#中实施策略模式?

答案 3 :(得分:0)

模式是建筑问题。代表们是一个执行问题。

在C#中,策略模式几乎总是使用委托来实现。

答案 4 :(得分:0)

策略模式是一种设计模式,允许您在执行时选择不同的函数,而委托是一种语言结构,允许您创建对函数的引用并将其用作变量。

策略模式更好地使用多态而不是委托实现,因为多态分派往往更优雅。

答案 5 :(得分:0)

可以看到委托类似于 Java 中使用的函数式接口 - 本质上是一个只有一种方法的接口。

从 Java8 开始,您实际上可以以更加匿名/内联的方式为函数式接口提供实现。

对于一个可以被单一方法覆盖的行为,进行策略实施有点矫枉过正,而且过于冗长。

它们本质上解决了“在类中插入可交换行为”的相同目的