先写一个策略模式的经典应用:
一个公司有很多员工,计算所有员工的平均年龄和平均工资。
我们先写一个员工类,
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();
}
}