设计模式用于解决软件开发中的常见设计问题,并降低我们源代码的复杂性。 设计模式可以是创新的(与对象创建有关),结构的(与对象组装有关)或行为的(与对象协作和职责分离有关)。
策略设计模式是四人一组(GoF)设计模式 。 这是一种行为模式,用于定义一系列算法并将每个算法封装在一个类中。 这些封装的算法可以互换-即,它们可以根据不同的输入而变化,而与使用它们的客户端无关。
换句话说,策略设计模式将实现代码分解为具体的类,从而提高了可重用性。 本文介绍了策略设计模式及其如何在C#中实现的讨论。
策略设计模式参与者
策略设计模式的典型实施方案的参与者包括:
- 策略-用于声明所有具体策略类型的公共接口。 上下文利用策略接口在运行时调用算法。
- ConcreteStrategy —用于实现在Strategy接口中声明的算法。
- 上下文-包含对Strategy实例的引用,并使用该引用来调用由具体策略类型定义的算法。
在C#中实现Strategy接口
到目前为止,一切都很好。 现在我们有了概念,现在让我们实现模式。 假设您要设计一种用于排序算法的策略。 例如,假设您需要对整数数组进行排序。 有很多排序算法,因此您想推迟选择要使用的排序算法。 这是策略设计模式起作用的地方。
以下抽象类表示策略类型。 此类包含抽象Sort方法的声明。
abstract class SortStrategy
{
public abstract void Sort(int[] list);
}
具体的策略类实现了Sort方法,并表示一种排序算法。 在此示例中,我们考虑了以下排序算法:
- 快速分类
- 贝壳类
- 气泡排序
- 合并排序
- 堆排序
在C#中实现ConcreteStrategy类
下面显示的具体策略类扩展了SortStrategy抽象类并实现了Sort方法。
class QuickSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Quick Sort");
}
}
class ShellSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Shell Sort");
}
}
class BubbleSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Bubble Sort");
}
}
class MergeSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Merge Sort");
}
}
class HeapSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Heap Sort");
}
}
请注意,我将留给您在每个具体策略类的Sort方法中实现排序算法。
在C#中实现Context类
Context类包含对SortStrategy的引用。 它还包含两个方法-SetSortStrategy方法和Sort方法。 前者用于设置要使用的排序策略,而后者用于根据所选的排序策略来调用Sort方法。
class Context
{
private const int MAX = 10;
private int[] numbers = new int[MAX];
private SortStrategy _sortstrategy;
public void SetSortStrategy(SortStrategy sortstrategy)
{
_sortstrategy = sortstrategy;
}
public void Sort()
{
_sortstrategy.Sort(numbers);
}
}
下面的代码段显示了如何创建Context类的实例,传递排序策略以及调用Sort方法。
static void Main(string[] args)
{
Context context = new Context();
context.SetSortStrategy(new QuickSort());
context.Sort();
Console.Read();
}
下面提供了完整的源代码供您参考。
using System;
namespace StrategyDesignPattern
{
abstract class SortStrategy
{
public abstract void Sort(int[] list);
}
class QuickSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Quick Sort");
}
}
class ShellSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Shell Sort");
}
}
class BubbleSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Bubble Sort");
}
}
class MergeSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Merge Sort");
}
}
class HeapSort : SortStrategy
{
public override void Sort(int[] list)
{
Console.WriteLine("Heap Sort");
}
}
class Context
{
private const int MAX = 10;
private int[] numbers = new int[MAX];
private SortStrategy _sortstrategy;
public void SetSortStrategy(SortStrategy sortstrategy)
{
_sortstrategy = sortstrategy;
}
public void Sort()
{
_sortstrategy.Sort(numbers);
}
}
class Program
{
static void Main(string[] args)
{
Context context = new Context();
context.SetSortStrategy(new QuickSort());
context.Sort();
Console.Read();
}
}
}
当您运行该程序时,以下文本消息将显示在控制台窗口中:
快速排序
顾名思义,策略设计模式是一种以多种方式解决问题的策略。 策略设计模式可用于封装对象的不同行为,并在不同情况下使用它们。 策略设计模式的一些典型用例包括实现排序算法,实现不同的文件压缩算法,实现各种类型的序列化等。
From: https://www.infoworld.com/article/3387130/how-to-use-the-strategy-design-pattern-in-net.html