2016-12-28 10 views
1

在計算機編程中,策略模式(也稱爲策略模式)是一種行爲軟件設計模式,可以在運行時選擇算法的行爲。策略模式與多態性有何不同?

策略模式...

  • 定義了一系列的算法。
  • 封裝每個算法。
  • 使算法在該系列內可互換。

(來源:Wikipedia

在我的情況,我希望能夠以不同的散列算法注入的服務。 C#有幾個散列算法,從HashAlgorithm派生,如:

  • MD5
  • SHA256Managed
  • RIPEMD160Managed

鑑於這個層次,這個看起來像戰略模式,但就我從來沒有聽說過的戰略模式,我可能會說這是多態的典型例子。

雖然設計的代碼來解決我的具體問題,我設計了一種基於策略模式的界面注入不同的散列算法:

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)?

+0

在您使用多態和策略模式的最後一段代碼中。多態性適用於'HashAlgorithm',可能是'MD5Algorithm'或'shanonAlgorithm' ...策略模式適用於'HashCreator',它可以與任何這些'HashAlgorithm'的引用一起工作 –

+0

@ M.kazemAkhgary如何使用'HashCreator'戰略模式? (不會有任何子類型的'HashCreator',它不會實現任何東西) – series0ne

+0

策略模式不處理繼承。這纔是重點。有了戰略模式,你就可以將課程分開,而不需要從另一個繼承。但能夠使用具有相同接口的其他類的行爲。 –

回答

3

多態性只是OO語言的一個功能,它允許您爲不同類型提供一個接口。 策略是一種概念模式,它在OO語言中使用多態,因爲它可以通過函數式編程中的函數來完成。

至於你提到的

策略模式(又稱政策模式)是一種行爲設計模式,使算法的行爲在運行時選擇

如此,不僅是多態,可以爲對象行爲設置不同的策略,例如可以改變策略,你的對象可以有很少的策略,不同的對象可以有相同的策略,一種類型的對象可以有不同的策略,有一個點。多態性只是一種方法(面向OO語言的最佳方法之一),您可以如何實現它。