在計算機編程中,策略模式(也稱爲策略模式)是一種行爲軟件設計模式,可以在運行時選擇算法的行爲。策略模式與多態性有何不同?
策略模式...
- 定義了一系列的算法。
- 封裝每個算法。
- 使算法在該系列內可互換。
(來源: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
)?
在您使用多態和策略模式的最後一段代碼中。多態性適用於'HashAlgorithm',可能是'MD5Algorithm'或'shanonAlgorithm' ...策略模式適用於'HashCreator',它可以與任何這些'HashAlgorithm'的引用一起工作 –
@ M.kazemAkhgary如何使用'HashCreator'戰略模式? (不會有任何子類型的'HashCreator',它不會實現任何東西) – series0ne
策略模式不處理繼承。這纔是重點。有了戰略模式,你就可以將課程分開,而不需要從另一個繼承。但能夠使用具有相同接口的其他類的行爲。 –