关于.NET Framework中的设计模式--应用策略模式为List排序攻略
策略模式
策略模式是一种对象行为型模式,它通过分离算法、选择实现不同的算法来解决对外提供的接口方法的操作不同的情况。
在程序设计中,策略模式往往涉及到两个角色:环境(Context)角色和策略(Strategy)角色。环境角色持有策略类的引用,而具体实现策略者实现了抽象策略者(Strategy)接口。
应用策略模式为List排序的过程
1. 确认排序对象
首先,我们需要确定要排序的集合对象类型,例如List
2. 定义排序的策略
定义一个排序策略接口或抽象类,其中至少包含一个排序方法。例如:
public interface ISortStrategy<T> where T : IComparable<T>
{
List<T> Sort(List<T> list);
}
3. 实现排序策略
按照定义的排序策略接口或抽象类实现具体的排序策略类,例如按照升序或降序等排序规则实现排序策略类:
public class AscendingSortStrategy<T> : ISortStrategy<T> where T : IComparable<T>
{
public List<T> Sort(List<T> list)
{
list.Sort();
return list;
}
}
public class DescendingSortStrategy<T> : ISortStrategy<T> where T : IComparable<T>
{
public List<T> Sort(List<T> list)
{
list.Sort();
list.Reverse();
return list;
}
}
4. 环境角色实现
环境角色需要引入 ISortStrategy 接口并在构造函数中传入具体的排序策略类。
public class SortContext<T> where T : IComparable<T>
{
private ISortStrategy<T> _strategy;
public SortContext(ISortStrategy<T> strategy)
{
_strategy = strategy;
}
public List<T> Sort(List<T> list)
{
return _strategy.Sort(list);
}
}
5. 游客应用策略模式进行排序
最后,游客可以根据情况,选择使用相应的策略进行排序:
var list = new List<string> { "John", "Carl", "Alex", "Bruce" };
var sortContext = new SortContext<string>(new AscendingSortStrategy<string>());
var sortedList = sortContext.Sort(list);
Console.WriteLine("按照升序排序:" + string.Join(", ", sortedList));
sortContext = new SortContext<string>(new DescendingSortStrategy<string>());
sortedList = sortContext.Sort(list);
Console.WriteLine("按照降序排序:" + string.Join(", ", sortedList));
运行结果:
按照升序排序:Alex, Bruce, Carl, John
按照降序排序:John, Carl, Bruce, Alex
示例说明
- 示例1:按照数字大小排序
基于上述策略模式实现的排序策略,也可以应用到数字类型排序的场景中。例如:
var numList = new List<int> { 10, 3, 7, 1, 6, 8 };
var numSortContext = new SortContext<int>(new AscendingSortStrategy<int>());
var sortedNumList = numSortContext.Sort(numList);
Console.WriteLine("按照升序排序:" + string.Join(", ", sortedNumList));
numSortContext = new SortContext<int>(new DescendingSortStrategy<int>());
sortedNumList = numSortContext.Sort(numList);
Console.WriteLine("按照降序排序:" + string.Join(", ", sortedNumList));
运行结果:
按照升序排序:1, 3, 6, 7, 8, 10
按照降序排序:10, 8, 7, 6, 3, 1
- 示例2:按照多个维度排序
由于策略模式支持定义多种不同的排序规则,所以可以在应用策略模式进行集合排序的场景中,加入多个维度的排序规则。
例如:我们可以先按照名字排序,再按照年龄排序。
public class Person : IComparable<Person>
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(Person other)
{
return string.Compare(Name, other.Name, StringComparison.OrdinalIgnoreCase);
}
}
public class NameAndAgeAscendSortStrategy<T> : ISortStrategy<T> where T : Person
{
public List<T> Sort(List<T> list)
{
list.Sort();
list.ThenBy(p => p.Age);
return list;
}
}
var peopleList = new List<Person>
{
new Person {Name = "John", Age = 30},
new Person {Name = "Alex", Age = 25},
new Person {Name = "Carl", Age = 35},
new Person {Name = "Bruce", Age = 20},
new Person {Name = "Alex", Age = 20}
};
var peopleSortContext = new SortContext<Person>(new NameAndAgeAscendSortStrategy<Person>());
var sortedPeopleList = peopleSortContext.Sort(peopleList);
Console.WriteLine("按照名字升序,年龄升序排序:" + string.Join("\n", sortedPeopleList.Select(p => $"姓名:{p.Name},年龄:{p.Age}")));
运行结果:
按照名字升序,年龄升序排序:
姓名:Alex,年龄:20
姓名:Alex,年龄:25
姓名:Bruce,年龄:20
姓名:Carl,年龄:35
姓名:John,年龄:30
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于.NET Framework中的设计模式–应用策略模式为List排序 - Python技术站