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

How does the strategy pattern differ from polymorphism?

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

策略模式...

(来源:Wikipedia

就我而言,我希望能够将不同的哈希算法注入到服务中。 C# 有几个派生自 HashAlgorithm 的哈希算法,例如:

鉴于这种层次结构,这看起来像是策略模式,但如果我从未听说过策略模式,我可能会说这是多态性的经典示例。

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

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

用法

public sealed class HashCreator
{
    public Hash GetHash(IHashStrategy strategy, byte[] data)
    {
        return strategy.ComputeHash(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 语言中的多态性,因为它可以用函数式编程中的函数来完成。

正如你所说,

the strategy pattern (also known as the policy pattern) is a behavioural software design pattern that enables an algorithm's behavior to be selected at runtime

所以,不仅仅是多态,你可以为对象的行为设置不同的策略,你可以改变策略,比如你的对象可以有几个策略,不同的对象可以有相同的策略,一种类型的对象可以有不同的策略,这是有道理的。多态性只是一种方式(恕我直言,面向 OO 语言的最佳方式),您可以如何实现它。