先写一个策略模式的经典应用:
一个公司有很多员工,计算所有员工的平均年龄和平均工资。
我们先写一个员工类,
public class Employee { public Employee(Sex sex, int salary){ this.sex = sex; this.salary = salary; } private Sex sex; private int salary; public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } public Sex getSex() { return sex; } public void setSex(Sex sex) { this.sex = sex; } } enum Sex{ MALE, FEMALE }
再来写一个calculator接口和两个实现类:
public interface ICalculator { public double calAverageSalary(List<Employee> employees); } class MaleEmployeeCalculator implements ICalculator{ @Override public double calAverageSalary(List<Employee> employees) { return employees.stream().filter(t -> t.getSex() == Sex.FEMALE).mapToInt(Employee::getSalary).average().getAsDouble(); } } class FemaleEmployeeCalculator implements ICalculator{ @Override public double calAverageSalary(List<Employee> employees) { return employees.stream().filter(t -> t.getSex() == Sex.FEMALE).mapToInt(Employee::getSalary).average().getAsDouble(); } }
客户端代码:
public class Client { public static void main(String[] args) { List<Employee> employeeList = new ArrayList(); employeeList.add(new Employee(Sex.MALE, 8000)); employeeList.add(new Employee(Sex.MALE, 9000)); employeeList.add(new Employee(Sex.MALE, 10000)); employeeList.add(new Employee(Sex.MALE, 7000)); employeeList.add(new Employee(Sex.FEMALE, 8000)); employeeList.add(new Employee(Sex.FEMALE, 8000)); employeeList.add(new Employee(Sex.FEMALE, 9000)); employeeList.add(new Employee(Sex.FEMALE, 10000)); ICalculator maleEmployeeCalculator = new MaleEmployeeCalculator(); double mAverageSalary = maleEmployeeCalculator.calAverageSalary(employeeList); System.out.println("Male employees average salary is: " + mAverageSalary); ICalculator femaleEmployeeCalculator = new FemaleEmployeeCalculator(); double fmAverageSalary = femaleEmployeeCalculator.calAverageSalary(employeeList); System.out.println("Female employees average salary is: " + fmAverageSalary); } }
下面用lambda来实现策略模式:
Employee类不变,无需使用ICalculator接口
客户端代码
public class LambdaTestClient { public static void main(String[] args) { List<Employee> employeeList = new ArrayList(); employeeList.add(new Employee(Sex.MALE, 8000)); employeeList.add(new Employee(Sex.MALE, 9000)); employeeList.add(new Employee(Sex.MALE, 10000)); employeeList.add(new Employee(Sex.MALE, 7000)); employeeList.add(new Employee(Sex.FEMALE, 8000)); employeeList.add(new Employee(Sex.FEMALE, 8000)); employeeList.add(new Employee(Sex.FEMALE, 9000)); employeeList.add(new Employee(Sex.FEMALE, 10000)); double mAverageSalary = calAverageSalary(employeeList,t->t.getSex() == Sex.MALE); System.out.println("Male employees average salary is: " + mAverageSalary); double fmAverageSalary = calAverageSalary(employeeList,t->t.getSex() == Sex.FEMALE); System.out.println("Female employees average salary is: " + fmAverageSalary); } static double calAverageSalary(List<Employee> employees, Predicate<Employee> p){ return employees.stream().filter(p).mapToInt(Employee::getSalary).average().getAsDouble(); } }