谋略模式与Comparator的定义和使用

策略模式与Comparator的定义和使用

Comparator可以让我们对复杂的类型进行自定义排序,如按对象的某个属性降序排序,功能很强大,使用起来也方便

只需要简单的实现Comparator接口

定义:

class ComparatorHDFileUserInfo implements Comparator<ScholatHDFileUseInfo>{

 

    public int compare(ScholatHDFileUseInfo o1, ScholatHDFileUseInfo o2) {   

 

       return o1.getTotalSize().compareTo(o2.getTotalSize())>0?0:1;

    }

}

这里是降序排序,要变为升序,把0和1的位置互换

使用:

       Collections.sort(scholatHDFileUseInfoList,new ComparatorHDFileUserInfo());

 

生成自定义Comparator的实例,在Collections.sort方法第二个参数中使用,前一个参数是待排序的List

 

这是策略模式的典型应用

策略模式是对象的行为模式,其用意是针对一组算法,将每一个算法封闭到具有共同接口的独立的类中,从而使得他们可以相互替换。

下图是排序的策略模式结构(引用):

谋略模式与Comparator的定义和使用

策略模式涉及到三个角色:

环境角色:持有抽象策略类的引用,并不关心具体的策略实现

抽象策略角色:这是一个抽象的角色,通常由抽象类或接口实现,给出所有具体策略所需的接口方法
具体策略角色:继承抽象策略,实现具体的算法

上例中,环境角色是Collections,抽象策略是Comparator,而具体策略是ComparatorHDFileUserInfo,实现按网盘总大小降序排列,如果以后改变需求,想按网盘使用者的工作单位排序,只需要实现另外加一个策略,实现Comparator接口。如:

class ComparatorHDFileUserInfoByWorkUtil implements Comparator<ScholatHDFileUseInfo>{

 

    public int compare(ScholatHDFileUseInfo o1, ScholatHDFileUseInfo o2) {   

 

       return o1.getWorkUnit().compareTo(o2.getWorkUnit())>0?0:1;

    }

}

 

 

Collections.sort(scholatHDFileUseInfoList,new ComparatorHDFileUserInfoByWorkUtil());

 

 

具体选用何种策略,由客户端决定

 

PS:如果要实现多关键字排序要怎么做呢,其实也很简单~

ScholatHDFileUseInfo学者网盘信息类有多个字段,要求多关键字排序,先按工作单位排,若工作单位相同则按大小排列

可以这样实现:

class ComparatorHDFileUserInfo implements Comparator<ScholatHDFileUseInfo>{

 

    public int compare(ScholatHDFileUseInfo o1, ScholatHDFileUseInfo o2) {   

       if(!o1.getWorkUnit().equals(o2.getWorkUnit()))//先按工作单位排列

       {

           return o1.getWorkUnit().compareTo(o2.getWorkUnit())>0?0:1;

       }

       else                                          //若工作单位相同,则按大小排列

       {

           return o1.getTotalSize().compareTo(o2.getTotalSize())>0?0:1;

       }     

    }

}