使用策略设计模式(C#)根据不同的数据列进行排序

时间:2013-11-28 10:33:09

标签: c# design-patterns strategy-pattern

我目前正试图了解所有不同的设计模式,我已经设置了基于不同列对IQueryable进行排序的任务,这就是当前实现的方式:

if (choice == 1)
{ 
    return from Animals in ctx.Animals orderby Animals.AnimalID descending select Animals; 
}
else if (choice == 2)
{ 
    return from Animals in ctx.Animals orderby Animals.Name descending select Animals; 
}
else if (choice == 3)
{ 
    return from Animals in ctx.Animals orderby Animals.Age descending select Animals; 
}

然而,这似乎是一个糟糕的代码味道,它没有能力轻松添加不同的字段或排序选项,我的导师告诉我,实施策略模式并使用{{1选择我们想要的策略实现,但是我不确定战略模式将如何应用于这种情况,如果需要更多信息,任何有用的提示都将受到极大的赞赏,请问。

2 个答案:

答案 0 :(得分:9)

应用策略模式,您将拥有ISortStrategy接口,然后是SortByIdSortByNameSortByAge等多个实现。接口及其实现将有一个像object Sort(Animal animal);这样的方法,它返回动物的一个属性。

然后,您只需在运行时选择正确的策略,并像这样使用它:

return from animal in ctx.Animals
       orderby sortStrategy.Sort(animal) descending
       select animal;

答案 1 :(得分:4)

继续@ dcastro的答案,关于词典。

您可以通过工厂类创建具体策略(并获得使用工厂的奖励积分):

public static class SortStrategyFactory()
{
    private static Dictionary<string, ISortStrategy> strategyRepository;

    static SortStrategyFactory()
    {
      strategyRepository = new Dictionary<string, ISortStrategy>();
      strategyRepository.Add("ID", new SortById());
      strategyRepository.Add("Name", new SortByName());
      strategyRepository.Add("Age", new SortByAge());
    }

    public static ISortStrategy GetStrategy(string key)
    {
      //todo: add error checking
      return strategyRepository[key];
    }

}

然后您的初始代码变为:

ISortStrategy sortStrategy= SortStrategyFactory.GetStrategy(choice);

return from animal in ctx.Animals
       orderby sortStrategy.Sort(animal)
       descending select animal;