正 文

封装的变化之排序算法中的封装


www.7dspace.com  更新日期:2006-3-10 6:48:44  七度空间


  设想这样一个需求,我们需要为自己的框架提供一个负责排序的组件。目前需要实现的是冒泡排序算法和快速排序算法,根据“面向接口编程”的思想,我们可以为这些排序算法提供一个统一的接口ISort,在这个接口中有一个方法Sort(),它能接受一个object数组参数。对数组进行排序后,返回该数组。接口的定义如下:

public interface ISort
{
 void Sort(ref object[] beSorted);
}

  其类图如下:

  然而一般对于排序而言,排列是有顺序之分的,例如升序,或者降序,返回的结果也不相同。最简单的方法我们可以利用if语句来实现这一目的,例如在QuickSort类中:

public class QuickSort:ISort
{
 private string m_SortType;
 public QuickSort(string sortType)
 {
  m_SortType = sortType;
 }
 public void Sort(ref object[] beSorted)
 {
  if (m_SortType.ToUpper().Trim() == “ASCENDING”)
  {
   //执行升序的快速排序;
  }
  else
  {
   //执行降序的快速排序;
  }
 }
}

  当然,我们也可以将string类型的SortType定义为枚举类型,减少出现错误的可能性。然而仔细阅读代码,我们可以发现这样的代码是非常僵化的,一旦需要扩展,如果要求我们增加新的排序顺序,例如字典顺序,那么我们面临的工作会非常繁重。也就是说,变化产生了。通过分析,我们发现所谓排序的顺序,恰恰是排序算法中最关键的一环,它决定了谁排列在前,谁排列在后。然而它并不属于排序算法,而是一种比较的策略,后者说是比较的行为。

  如果仔细分析实现ISort接口的类,例如QuickSort类,它在实现排序算法的时候,需要对两个对象作比较。按照重构的做法,实质上我们可以在 Sort方法中抽取出一个私有方法Compare(),通过返回的布尔值,决定哪个对象在前,哪个对象在后。显然,可能发生变化的是这个比较行为,利用 “封装抽象”的原理,就应该为该行为建立一个专有的接口ICompare,然而分别定义实现升序、降序或者字典排序的类对象。

  我们在每一个实现了ISort接口的类构造函数中,引入ICompare接口对象,从而建立起排序算法与比较算法的弱耦合关系(因为这个关系与抽象的ICompare接口相关),例如QuickSort类:

public class QuickSort:ISort
{
 private ICompare m_Compare;
 public QuickSort(ICompare compare)
 {
  m_Compare= compare;
 }
 public void Sort(ref object[] beSorted)
 {
  //实现略
  for (int i = 0; i < beSorted.Length - 1; i++)
  {
   if (m_Compare.Compare(beSorted[i],beSorted[i+1))
   {
    //略;
   }
  }
  //实现略
 }
}

  最后的类图如下:

2页,页码:[1] [2] 

上一篇:用快捷键快速解决QQ空间的几个常见问题
下一篇:Photoshop蒙版妙用:无痕合成美女照片
封装的变化之排序算法中的封装 作者:wayfarer 来源:博客园
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐