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

ser*_*0ne 1 c# oop polymorphism design-patterns strategy-pattern

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

策略模式...

  • 定义了一系列算法。
  • 封装了各个算法。
  • 使算法在该系列内可以互换。

(来源:维基百科

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

  • MD5
  • SHA256托管
  • RIPEMD160托管

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

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

public interface IHashStrategy
{
    Hash ComputeHash(byte[] data);
}
Run Code Online (Sandbox Code Playgroud)

用法

public sealed class HashCreator
{
    public Hash GetHash(IHashStrategy strategy, byte[] data)
    {
        return strategy.ComputeHash(data);
    }
}
Run Code Online (Sandbox Code Playgroud)

回到我之前的例子,我同样可以完全摆脱界面并只使用HashAlgorithm

public sealed class HashCreator
{
    public Hash GetHash(HashAlgorithm algorithm, byte[] data)
    {
        return new Hash(algorithm.ComputeHash(data));
    }
}
Run Code Online (Sandbox Code Playgroud)

问题 1:策略模式与多态性有什么不同,还是因为多态性才存在策略模式?

问题 2:这里认为哪种做法更好?将我需要的功能抽象为接口 ( IHashStrategy) 还是使用基本类型 ( HashAlgorithm)?

Ore*_*hak 5

多态性只是面向对象语言的一项功能,它允许您为不同类型提供一个接口。策略是概念模式,它使用 OO 语言中的多态性,例如可以使用函数式编程中的函数来完成。

正如你提到的,

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

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