7

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

但除此之外,它们似乎都指向需要特定签名的函数,并且它们都可以用来确定在运行时要执行什么。

我缺少更明显的区别吗?

我想一个相关的问题是,如果它们相似,那么使用一个比另一个有什么优势?

4

6 回答 6

14

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

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

换句话说,策略模式是蓝图,C# 委托是砖块。没有任何一个,您都无法建造(战略模式)房屋。(您也可以使用其他类型的积木来构建它,但委托的语言特性中没有任何内容可以固有地描述策略模式)。

于 2009-02-09T19:34:26.367 回答
2

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

委托可用于 .NET 策略模式的特定于平台的实现,但并不是实现此类解决方案的唯一方法。

另一种解决方案是定义一个接口,如:

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

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

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

于 2009-02-09T19:46:03.203 回答
0

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

于 2009-02-09T19:33:22.797 回答
0

模式是架构的问题。代表是一个执行问题。

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

于 2009-02-09T19:34:33.527 回答
0

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

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

于 2009-02-09T19:34:35.757 回答
0

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

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

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

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

于 2021-05-16T15:41:39.200 回答