我一直在研究策略模式实现示例,在我看来它们与c#delegates非常相似。我看到的唯一区别是策略模式实现不需要显式声明委托。
但除此之外,它们似乎都指向需要特定签名的函数,它们都可用于确定在运行时执行的内容。
我缺少一个更明显的区别吗?
我猜一个相关的问题是,如果他们相似,那么使用一个优于另一个的优势是什么?
答案 0 :(得分:13)
简而言之,您可以使用委托来实施战略模式。
策略模式是一种模式。代表是一种语言功能。您可以使用语言功能来实现模式。它们完全存在于两个不同的概念类别中,但它们之间的相互作用是相关的。
换句话说,战略模式是蓝图,C#代表是砖块。没有任何一个,你无法建立(策略模式)房子。 (您也可以使用其他类型的砖来构建它,但代理的语言功能中没有任何内容本身描述策略模式)。
答案 1 :(得分:2)
设计模式是与语言无关的常见问题的高级解决方案。
代理可以在.NET的策略模式的特定于平台的实现中使用,但不是实现此类解决方案的唯一方法。
另一种解决方案是定义如下界面:
public interface IStrategy
{
void DoStuff(...)
}
策略将由实现此接口的类表示,而不是由委托表示。
如果您希望您的策略非常简单,那么代表可能是一个好的实现。对于任何相当复杂的事情,在跟踪状态,将事物组织成多种方法,在实现之间共享代码等方面,将接口实施为接口可以提供更多选择。
答案 2 :(得分:0)
您如何在C#中实施策略模式?
答案 3 :(得分:0)
模式是建筑问题。代表们是一个执行问题。
在C#中,策略模式几乎总是使用委托来实现。
答案 4 :(得分:0)
策略模式是一种设计模式,允许您在执行时选择不同的函数,而委托是一种语言结构,允许您创建对函数的引用并将其用作变量。
策略模式更好地使用多态而不是委托实现,因为多态分派往往更优雅。
答案 5 :(得分:0)
可以看到委托类似于 Java 中使用的函数式接口 - 本质上是一个只有一种方法的接口。
从 Java8 开始,您实际上可以以更加匿名/内联的方式为函数式接口提供实现。
对于一个可以被单一方法覆盖的行为,进行策略实施有点矫枉过正,而且过于冗长。
它们本质上解决了“在类中插入可交换行为”的相同目的