策略模式其实是对同一实体的同一方法有不同的策略,对策略进行封装,对修改关闭对扩展开发的一种设计思想。例如对一个实体猫比较大小可以定义年龄比较大小也可以定义体重比较大小。这种不同比较大小方式的挑选就是策略模式,把策略单独封装成一个类大大降低了系统的耦合性。
首先创建实体类:Dog
public class Dog {
int age;
public Dog(int age) {
this.age = age;
}
}
编写自己的Comparator接口,java有一个自带的Comparator但是这里我们方便更好的理解策略模式就自己敲一个。
public interface Comparator<T> {
int compareTo(T o1,T o2);
}
写一个Dog类型的比较器继承Comparator接口
public class DogComparator implements Comparator<Dog>{
@Override
public int compareTo(Dog o1, Dog o2) {
if (o1.age-o2.age > 0) return 1;//o1大
else if (o1.age-o2.age < 0) return -1;//o2大
else return 0;
}
}
再写一个比较器Sorter
public class Sorter<T> {
public void sort(T[] arr, Comparator comparetor){
for (int i = 0; i < arr.length-1; i++) {
int minPos = i;
for(int j = i+1; j<arr.length;j++){
minPos = comparetor.compareTo(arr[j],arr[minPos])==-1 ? j : minPos;
}
swap(arr,i,minPos);
}
}
void swap(T[] arr,int i, int j){
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void show(T[] arr){
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
来一个主方法测试一下
public static void main(String[] args) {
Dog arr[] = {new Dog(12),new Dog(18),new Dog(14)};
Sorter<Dog> sorter = new Sorter<>();
Comparator<Dog> comparator = new DogComparator();
sorter.sort(arr,comparator);
sorter.show(arr);
}
图解一下:Sorter的sort方法中传入泛型的数组和实现了Comparator接口的比较器实现类。比较器的泛型是由接口指定的。所以只需要创建一个指定泛型的比较器和数组一起传入sort方法即可。