策略设计模式 (C#)






4.05/5 (6投票s)
一个控制台应用程序,用于计算文本中单词出现的次数。
引言
本技巧演示了策略设计模式的使用。 我们展示了基于策略的两种不同的 IDictionary<K,T>
实现。
背景
策略是一种行为设计模式,涉及将算法从其宿主类中移除并放入一个单独的类中。 对于给定的问题,可能存在不同的算法(策略)。 如果所有算法都保存在宿主中,将会导致代码混乱,并包含大量的条件语句。 策略模式使客户端能够从一组算法中选择要使用的算法,并提供了一种简单的方式来访问它。
Using the Code
在我们的当前示例中,我们的算法族是 IDictionary<K,T>
的两种不同实现。 第一个算法将返回一个简单的 Dictionary<K,T>
,而第二个算法将返回一个 SortedDictionary<K,T>
。
public interface IDictionaryStrategy
{
IDictionary<string, int> GetProcessedText(string text);
}
public class DictionaryStrategy : IDictionaryStrategy
{
public IDictionary<string, int> GetProcessedText(string text)
{
string[] words = text.Split(' ', ';', ',', '.');
var dictionary = new Dictionary<string, int>();
int count = 1;
foreach (var item in words.Where(x => x != string.Empty))
{
int value=0;
if(!dictionary.TryGetValue(item,out value))
{
count = 0;
}
dictionary[item] = ++count;
}
return dictionary;
}
}
public class SortedDictionaryStrategy : IDictionaryStrategy
{
public IDictionary<string, int> GetProcessedText(string text)
{
string[] words = text.Split(' ', ';', ',', '.');
var dictionary = new SortedDictionary<string, int>(new CaseInsensitiveComparer());
int count = 1;
foreach (var item in words.Where(x=>x!=string.Empty))
{
int value = 0;
if (!dictionary.TryGetValue(item, out value))
{
count = 0;
}
dictionary[item] = ++count;
}
return dictionary;
}
class CaseInsensitiveComparer : IComparer<string>
{
public int Compare(string s1, string s2)
{
return string.Compare(s1, s2, true);
}
}
}
关注点
GoF的忠实粉丝!