C# 策略模式与多态性有何不同?

C# 策略模式与多态性有何不同?,c#,oop,design-patterns,polymorphism,strategy-pattern,C#,Oop,Design Patterns,Polymorphism,Strategy Pattern,在计算机编程中,策略模式(也称为策略模式)是一种行为软件设计模式,允许在运行时选择算法的行为 战略模式 定义一系列算法 封装每个算法 使算法在该族中可互换 (来源:) 在我的例子中,我希望能够将不同的哈希算法注入到服务中。C#有几种哈希算法,它们都是从中派生出来的,例如: MD5 SHA256管理 成熟的160管理 考虑到这种层次结构,这看起来像是策略模式,但如果我从未听说过策略模式,我可能会说这是多态性的一个经典示例 在设计代码以解决我的特定问题时,我根据策略模式设计了一个接口,以注入

在计算机编程中,策略模式(也称为策略模式)是一种行为软件设计模式,允许在运行时选择算法的行为

战略模式

  • 定义一系列算法
  • 封装每个算法
  • 使算法在该族中可互换
(来源:)

在我的例子中,我希望能够将不同的哈希算法注入到服务中。C#有几种哈希算法,它们都是从中派生出来的,例如:

  • MD5
  • SHA256管理
  • 成熟的160管理
考虑到这种层次结构,这看起来像是策略模式,但如果我从未听说过策略模式,我可能会说这是多态性的一个经典示例

在设计代码以解决我的特定问题时,我根据策略模式设计了一个接口,以注入不同的哈希算法:

public interface IHashStrategy
{
    Hash ComputeHash(byte[] data);
}
用法

回到上一个例子,我同样可以完全去掉接口,只使用
HashAlgorithm

public sealed class HashCreator
{
    public Hash GetHash(HashAlgorithm algorithm, byte[] data)
    {
        return new Hash(algorithm.ComputeHash(data));
    }
}
问题1:策略模式是否与多态性有任何不同,或者是因为多态性才存在策略模式


问题2:这里认为哪种做法更好;将我需要的功能抽象到一个接口(
IHashStrategy
)中,或者使用基本类型(
HashAlgorithm
)?

多态性只是OO语言的一个特性,它允许您为不同类型使用一个接口Strategy是一种概念模式,它在OO语言中使用多态性,例如在函数式编程中可以使用函数

正如你提到的

策略模式(也称为策略模式)是一种行为软件设计模式,允许在运行时选择算法的行为


所以,不仅仅是多态性,你可以为对象行为设置不同的策略,你可以改变策略例如,你的对象可以有很少的策略,不同的对象可以有相同的策略,一种类型的对象可以有不同的策略,这是有一点的。多态性只是实现它的一种方式(对于OO语言imho来说是最好的方式)。

多态性只是OO语言的一个特性,它允许您为不同类型使用一个接口Strategy是一种概念模式,它在OO语言中使用多态性,例如在函数式编程中可以使用函数

正如你提到的

策略模式(也称为策略模式)是一种行为软件设计模式,允许在运行时选择算法的行为


所以,不仅仅是多态性,你可以为对象行为设置不同的策略,你可以改变策略例如,你的对象可以有很少的策略,不同的对象可以有相同的策略,一种类型的对象可以有不同的策略,这是有一点的。多态性只是实现它的一种方式(对于OO语言imho来说是最好的方式)。

在上一段代码中,您同时使用了多态性和策略模式。多态性用于
HashAlgorithm
,可能是
MD5Algorithm
shannonalgorithm
。。。策略模式用于
HashCreator
,它可以与这些
HashAlgorithm
s@M.kazemAkhgary
HashCreator
如何使用策略模式?(HashCreator不会有任何子类型,也不会实现任何东西)策略模式不处理继承。这就是重点。使用strategy模式可以分离类,而不会使一个类从另一个类继承。但是可以使用具有相同接口的其他类的行为。hmmm但是很抱歉,您的上一个代码段使用了
依赖项注入模式
,因为您是从外部将
HashAlgorithm
注入到
HashCreator
。如果您在
HashCreator
itself@M.kazemAkhgary策略模式没有定义使用哪种策略的决策将由内部做出。事实上,在GoF的《设计模式》一书中,它们指出客户机负责更改策略。在上一个代码片段中,您同时使用了多态性和策略模式。多态性用于
HashAlgorithm
,可能是
MD5Algorithm
shannonalgorithm
。。。策略模式用于
HashCreator
,它可以与这些
HashAlgorithm
s@M.kazemAkhgary
HashCreator
如何使用策略模式?(HashCreator不会有任何子类型,也不会实现任何东西)策略模式不处理继承。这就是重点。使用strategy模式可以分离类,而不会使一个类从另一个类继承。但是可以使用具有相同接口的其他类的行为。hmmm但是很抱歉,您的上一个代码段使用了
依赖项注入模式
,因为您是从外部将
HashAlgorithm
注入到
HashCreator
。如果您在
HashCreator
itself@M.kazemAkhgary策略模式没有定义使用哪种策略的决策将由内部做出。事实上,在GoF的《设计模式》一书中,他们指出客户负责改变策略。
public sealed class HashCreator
{
    public Hash GetHash(HashAlgorithm algorithm, byte[] data)
    {
        return new Hash(algorithm.ComputeHash(data));
    }
}