有一个员工类:
1 | public class Employee { |
准备初始数据:
1 | List<Employee> employeeList = Arrays.asList( |
初始需求:获取年龄大于 35 的员工
1 | publi List<Employee> filterEmployeeAgeOver35(List<Employee> employeeList) { |
当然了, 35 应该用常量代替
需求变更:获取年龄大于 20 的员工
1 | publi List<Employee> filterEmployeeAgeOver20(List<Employee> employeeList) { |
对方法进行重构:
1 | publi List<Employee> filterEmployeeByAge(List<Employee> employeeList, int overAge) { |
此时需求再次发生变更:获取工资大于 10000 的员工
1 | publi List<Employee> filterEmployeeBySalary(List<Employee> employeeList, double overSalary) { |
此时发现两个方法非常相似,且如果需求变的更加灵活复杂,如:
获取员工工资大于8000小于2000的员工;获取员工年龄小于35但工资大于10000的员工等等
为了继续优化,此时需要引入策略设计模式:
定义比较策略方法:
1 | public interface MyEmployeeFilter<T> { |
通过策略方法实现比较:
1 | public List<Employee> filterEmployee(List<Employee> employeeList, MyEmployeeFilter<Employee> employeeFilter) { |
那么不管是什么比较的需求,只需要实现 MyEmployeeFilter 接口即可, 不能的需求,实现不同的比较。
比如:
1 | public class FileterEmployeeByAgeOver35 implements MyEmployeeFilter<Employee> { |
如果不想每次都创建一个新的实现类,可以使用匿名内部类的方式:
1 | List<Employee> employeeList = filterEmployee(employees, new MyEmployeeFilter<Employee>() { |
使用 Lambda 表达式:
1 | List<Employee> employees = filterEmployee(employeeList, (e) -> (e).getAge() >= 35); |
Lambda 表达式相对于匿名内部类,代码更加简洁,更加可读