理论写着写着就明白了
应用场景
- 例如 Interface Comparator 中的compare方法
- 当同一个功能需要不通过不同的方式进行处理
- 比如付大厨做的一盘菜,李明想站着吃,Danny想跪着吃,Janny想哭着吃
二话不说先上代码 仿Comparator
实际工作中我们有一个排序的方法,但是需求一会儿想学生按照年龄大小进行排序一会儿又想学生按照体重大小进行排序,这就用到了策略模式。
//这里的泛型时最后的优化版本,可以去掉泛型,利用sort 与 Student*C 进行理解
public class Sorter<T> {
public void sort(T[] arr,Comparator<Student> comparator){
for (int i = 0; i < arr.length - 1; i++) {
int minPos = i;
for (int j=i+1;j<arr.length; j++){
minPos = comparator.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;
}
}
利用学生年龄|体重进行排序
public interface Comparator<T> {
int compareTo(T s1,T s2);
}
public class SudentYearC implements Comparator<Student> {
@Override
public int compareTo(Student s1, Student s2) {
if(s1.year < s2.year) return -1;
if(s1.year > s2.year) return 1;
else return 0;
}
}
public class StudentWeightC implements Comparator<Student> {
@Override
public int compareTo(Student t1, Student t2) {
if(t1.weiht > t2.weiht) return -1;
if(t1.weiht < t2.weiht) return 1;
else return 0;
}
}
测试代码,我们应用策略模式之后,对于不同的排序方式,我们只需要写出不同的比较器就可以直接进行排序,提高可扩展性。写不同的比较器方便理解,最后优化成泛型模式的,更加的方便快捷
public class Main {
public static void main(String[] args) {
Student[] students = {new Student(1,10),new Student(9,7),new Student(5,6),new Student(3,18)};
Sorter<Student> sorter = new Sorter();
//sorter.sort(students,new StudentWeightC());
sorter.sort(students,new SudentYearC());
/*sorter.sort(students,((s1, s2) -> {
if(s1.weiht > s2.weiht) return -1;
if(s1.weiht < s2.weiht) return 1;
else return 0;
}));*/
for (int i = 0; i < students.length; i++) {
System.out.println(students[i]);
}
}
}