1.引子
最近学习了一定的Java并发编程,想试着实现类似于Thread
类(lambda表达式作为参数)的构造器实现,想了解其中的设计模式,即策略设计模式,而查阅资料,发现许多文章并非是从类的设计角度出发,并且很多没有将Java8的函数式编程纳入其中,故作此文。
2.设计模式思路
明确目标:我们所要达到的目的是,使用对象构造器的时候直接可以将lambda
表达式传入构造器,而不用对每个对象中的父类方法进行重写。后者无疑在方法需要修改的情况下会进行多个对象的方法重写,而前者只需要一个。
首先写一个只含一个抽象方法的接口,用于lambda
表达式函数式编程的入口参数编写
CodeBlock-1:
@FunctionalInterface
public interface CalculatorMethod {
double getTax(int salary, double bonus);//default:public
}
第二步,创建一个雇员对象,用于函数式编程的具体实现
类的内部域以及方法需要注意的点:
- 额外一个指向接口的实例域,并用用于构造器传入lambda表达式初始化该指向抽象接口对象的域
- 用传入的lambda表达式所形成的接口的实现类来执行相关方法,比如下面例子中的getTax方法
CodeBlock-2:
public class Employer {
private final int salary;
private final double bonus;
private final CalculatorMethod calculatorMethod;
public Employer(int salary, double bonus, CalculatorMethod calculatorMethod) {
this.salary = salary;
this.bonus = bonus;
this.calculatorMethod = calculatorMethod;
}
public int getSalary() {
return salary;
}
public double getBonus() {
return bonus;
}
public double getTax() {
return calculatorMethod.getTax(salary, bonus);
}
}
最后一步,进行代码实现测试,在main方法中调用:
CodeBlock-3:
public class Test {
public static void main(String[] args) {
Employer employer =new Employer(20000,12000d,(salary, bonus) -> salary*0.1+bonus*0.15);
System.out.println(employer.getTax());
}
}