我目前正试图了解所有不同的设计模式,我已经设置了基于不同列对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选择我们想要的策略实现,但是我不确定战略模式将如何应用于这种情况,如果需要更多信息,任何有用的提示都将受到极大的赞赏,请问。
答案 0 :(得分:9)
应用策略模式,您将拥有ISortStrategy
接口,然后是SortById
,SortByName
和SortByAge
等多个实现。接口及其实现将有一个像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;