65.9K
CodeProject 正在变化。 阅读更多。
Home

策略设计模式 (C#)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.05/5 (6投票s)

2015年2月12日

CPOL
viewsIcon

30919

downloadIcon

222

一个控制台应用程序,用于计算文本中单词出现的次数。

引言

本技巧演示了策略设计模式的使用。 我们展示了基于策略的两种不同的 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的忠实粉丝!

© . All rights reserved.