`

java8,用lambda实现策略模式

 
阅读更多

先写一个策略模式的经典应用:

一个公司有很多员工,计算所有员工的平均年龄和平均工资。

我们先写一个员工类,

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();
   }

}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics