当我们需要解决同一类问题的时候,若发现这类问题大部分处理过程是一致的,只是核心步骤存在差异,这时候就可以使用以下方式:先把函数相同的部分写好,再抽象出一个接口,不同部分的代码放在接口的实现类中。要使用时,只需将实现类的对象传递给该函数即可。
这种方式在设计模式中称为“策略模式”。
1.函数相同的部分:
public class FilterUtil<T> {
private FilterProcessor filterProcessor;
public List<T> filter(List<T> list,FilterProcessor filterProcessor){
List<T> result=new ArrayList<T>();
for (T t:list){
if (filterProcessor.process(t))
result.add(t);
}
return result;
}
}
2.抽象出一个接口:
public interface FilterProcessor<T>{
boolean process(T t);
}
3.实现类
public class FilterAgeImpl implements FilterProcessor<Teacher> {
@Override
public boolean process(Teacher teacher) {
if (teacher.getAge()>=30)
return true;
return false;
}
}
4.测试
public static void main(String[] args) {
List<Teacher> teachers=new ArrayList<>();
Teacher t1=new Teacher(1,25,"a");
Teacher t2=new Teacher(2,29,"b");
Teacher t3=new Teacher(3,30,"c");
teachers.add(t1);
teachers.add(t2);
teachers.add(t3);
FilterUtil filterUtil=new FilterUtil();
List<Teacher> result2=filterUtil.filter(teachers,new FilterAgeImpl());
for (Teacher teacher: result2){
System.out.println(teacher.getName()+" age:"+teacher.getAge());
}
}
5.使用匿名内部类实现策略模式
可以不用写实现类了
//使用匿名函数过滤年龄大于等于30的
List<Teacher> result =filterUtil.filter(teachers, new FilterProcessor<Teacher>() {
@Override
public boolean process(Teacher teacher) {
if (teacher.getAge()>=30)
return true;
return false;
}
});
// 过滤id大于1的
List<Teacher> result1 =filterUtil.filter(teachers, new FilterProcessor<Teacher>() {
@Override
public boolean process(Teacher teacher) {
if (teacher.getId()>1)
return true;
return false;
}
});
for (Teacher t:result){
System.out.println(t.getName()+" age: "+t.getAge());
}
for (Teacher t:result1){
System.out.println(t.getName()+" id:"+t.getId());
}
6.使用lamdba实现策略模式
使用匿名实现类,可以省去写实现类,但是如果写了很多匿名实现类的话,代码看起来就不是很简洁
将匿名实现类该写成lamdba,看起来就很舒服。这样既不用写实现类了,代码看起来也简洁。
//使用lamdba表达式过滤年龄大于等于30的
List<Teacher> result3 =filterUtil.filter(teachers,(o)->{Teacher teacher=(Teacher)o;return teacher.getAge()>=30;});
//使用lamdba表达式过滤id大于1的
List<Teacher> result4 =filterUtil.filter(teachers,(o)->{Teacher teacher=(Teacher)o;return teacher.getId()>1;});
for (Teacher t:result3){
System.out.println(t.getName()+" age:"+t.getAge());
}
for (Teacher t:result4){
System.out.println(t.getName()+" id:"+t.getId());
}