小王在公司正在开发一个学生管理系统,产品经理向他提出一个需求,要筛选出年龄大于15的学生,于是小王写出了以下代码:
public static List<Student> filterAgeStudent(List<Student> students) {List<Student> list = Lists.newArrayList();
for (Student student : students) {
if (student.getAge() > 15) {
list.add(student);
}
}
return list;
}
过了几天产品经理又提出了一个需求,要筛选出体重大于50KG的学生,于是小王新增了一个方法:
public static List<Student> filterWeightStudent(List<Student> students) {List<Student> list = Lists.newArrayList();
for (Student student : students) {
if (student.getWeight() > 50) {
list.add(student);
}
}
return list;
}
过了一段时间,产品提出了要筛选出体重大于50并且年龄要大于15的学生,小王突然感觉到这不是一个简单的需求,于是小王仔细思考了一下,突然想到将每种筛选的策略抽象成为一个接口,并且将这个接口当做一个参数传入方法中,这样每次就可以只新增策略,其他代码不需要更改了,这样就满足了软件设计的六大原则的开放闭合原则,于是乎诞生以下的设计和代码:
public interface StudentPredicate {boolean filter(Student student);
}
public class AgeStudentPredicate implements StudentPredicate {
@Override
public boolean filter(Student student) {
return student.getAge() > 20 ? true : false;
}
}
public static List<Student> filterStudent(List<Student> students,
StudentPredicate predicate) {
List<Student> list = Lists.newArrayList();
for (Student student : students) {
if (predicate.filter(student)) {
list.add(student);
}
}
return list;
}
经过一段时间的学习,小王接触到匿名类,于是小王代码进行更改,以后再也不需要写策略了:
List<Student> list = filterStudent(students, new StudentPredicate() {@Override
public boolean filter(Student student) {
return student.getAge() > 15;
}
});