策略模式是一种设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换使用。这种模式允许在运行时选择适合当前对象的算法,并且可以轻松地替换它们。
策略模式的核心思想是将算法的选择和使用分离开来,使得算法可以独立于使用它们的客户端代码。这样,当算法需要更改或者添加新的算法时,不需要修改客户端代码,只需要更改算法的引用即可。
策略模式通常包含以下几个部分:
策略模式适用于以下场景:
下面是一个使用策略模式选择排序算法的示例。假设需要编写一个应用程序,它可以对不同类型的对象进行排序,例如:学生的学号、铁路乘客的票号或者县居民的名字。
不同的排序算法适用于不同的数据类型和场景。例如,快速排序可能适合排序县居民的名字,归并排序适合排序学生的学号(整数/双精度数),而堆排序可能最适合排序铁路乘客。
以下是使用策略模式实现排序算法选择的C#代码示例:
class Program
{
static void Main(string[] args)
{
ISortingStrategy sortingStrategy = null;
// 排序县居民
List<string> countyResidents = new List<string>{
"ad",
"ac",
"ax",
"zw"
};
sortingStrategy = GetSortingOption(ObjectToSort.CountyResidents);
sortingStrategy.Sort(countyResidents);
// 排序学生学号
List<int> studentNumbers = new List<int>{
123,
678,
543,
189
};
sortingStrategy = GetSortingOption(ObjectToSort.StudentNumber);
sortingStrategy.Sort(studentNumbers);
// 排序铁路乘客
List<string> railwayPassengers = new List<string> {
"A21",
"Z2",
"F3",
"G43"
};
sortingStrategy = GetSortingOption(ObjectToSort.RailwayPassengers);
sortingStrategy.Sort(railwayPassengers);
}
private static ISortingStrategy GetSortingOption(ObjectToSort objectToSort)
{
ISortingStrategy sortingStrategy = null;
switch (objectToSort)
{
case ObjectToSort.StudentNumber:
sortingStrategy = new MergeSort();
break;
case ObjectToSort.RailwayPassengers:
sortingStrategy = new HeapSort();
break;
case ObjectToSort.CountyResidents:
sortingStrategy = new QuickSort();
break;
default:
break;
}
return sortingStrategy;
}
}
// 枚举,用于不同的排序类型
public enum ObjectToSort
{
StudentNumber,
RailwayPassengers,
CountyResidents
}
// 排序策略接口
public interface ISortingStrategy
{
void Sort<T>(List<T> dataToBeSorted);
}
// 快速排序算法
public class QuickSort : ISortingStrategy
{
public void Sort<T>(List<T> dataToBeSorted)
{
// 快速排序的逻辑
}
}
// 归并排序算法
public class MergeSort : ISortingStrategy
{
public void Sort<T>(List<T> dataToBeSorted)
{
// 归并排序的逻辑
}
}
// 堆排序算法
public class HeapSort : ISortingStrategy
{
public void Sort<T>(List<T> dataToBeSorted)
{
// 堆排序的逻辑
}
}
在这个示例中,定义了一个排序策略接口(ISortingStrategy),并实现了三种具体的排序算法(QuickSort、MergeSort、HeapSort)。然后,根据要排序的对象类型,在运行时选择合适的排序算法。
这种设计使得算法的选择和使用分离,提高了代码的灵活性和可维护性。如果需要更换或添加新的排序算法,只需要修改GetSortingOption方法中的逻辑,而不需要修改客户端代码。
策略模式不仅可以用于算法选择,还可以应用于其他需要动态选择行为的场景。例如,可以用于实现一个折扣系统,根据不同类型的客户动态选择不同的折扣策略。