谋略模式与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
这是策略模式的典型应用
策略模式是对象的行为模式,其用意是针对一组算法,将每一个算法封闭到具有共同接口的独立的类中,从而使得他们可以相互替换。
下图是排序的策略模式结构(引用):
策略模式涉及到三个角色:
环境角色:持有抽象策略类的引用,并不关心具体的策略实现
抽象策略角色:这是一个抽象的角色,通常由抽象类或接口实现,给出所有具体策略所需的接口方法
具体策略角色:继承抽象策略,实现具体的算法
上例中,环境角色是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; } } }