C# 设计模式系列教程-策略模式

2019-12-30 12:49:38于海丽

5. 实例:排序是我们经常接触到的算法,实现对一个数组的排序有很多方法,即可以采用不同的策略。下面给出了排序功能的策略模式的解决方案。

  5.1 实现类图

C#,设计模式,策略模式

  5.2 代码实现


 /// <summary>
 /// 排序算法策略
 /// </summary>
 public abstract class SortStratege
 {
  /// <summary>
  /// 排序
  /// </summary>
  /// <param name="array"></param>
  /// <returns></returns>
  public abstract int[] Sort(int[] array);
 }

 /// <summary>
 /// 冒泡排序
 /// </summary>
 public class BubbleSort : SortStratege
 {
  /// <summary>
  /// 冒泡排序算法(递增排序)
  /// </summary>
  /// <param name="array"></param>
  /// <returns></returns>
  public override int[] Sort(int[] array)
  {
   // 实现冒泡排序算法
   for (int i = 0; i < array.Length; i++)
   {
    for (int j = i + 1; j < array.Length; j++)
    {
     if (array[i] > array[j])
     {
      int temp = array[j];
      array[j] = array[i];
      array[i] = temp;
     }
    }
   }

   return array;
  }
 }

 /// <summary>
 /// 插入排序
 /// </summary>
 public class InsertSort : SortStratege
 {

  /// <summary>
  /// 插入排序算法(递增排序)
  /// </summary>
  /// <param name="array"></param>
  /// <returns></returns>
  public override int[] Sort(int[] array)
  {
   // 实现插入排序算法
   int temp;
   int i, j, n;
   n = array.Length;

   for (i = 1; i < n; i++)
   {
    temp = array[i];
    for (j = i; j > 0; j--)
    {
     if (temp < array[j - 1])
      array[j] = array[j - 1];
     else
      break;

     array[j] = temp;
    }
   }
   return null;
  }
 }

 public class SortContext
 {
  private int[] m_Array;
  private SortStratege m_Stratege;

  /// <summary>
  /// 初始化时将要排序的数组和排序策略传入给Context
  /// </summary>
  /// <param name="array"></param>
  /// <param name="stratege"></param>
  public SortContext(int[] array, SortStratege stratege)
  {
   m_Array = array;
   m_Stratege = stratege;
  }

  /// <summary>
  /// 调用排序算法
  /// </summary>
  /// <returns></returns>
  public int[] Sort()
  {
   int[] result = m_Stratege.Sort(this.m_Array);

   return result;
  }
 }

  5.3 客户端代码