引子
public class DemoTest {
public static int cal(Integer num1, Integer num2, String op) {
switch (op) {
case "+":
return num1 + num2;
case "-":
return num1 - num2;
case "*":
return num1 * num2;
case "/":
return num1 / num2;
case "%":
return num1 % num2;
default:
throw new RuntimeException("operation error");
}
}
public static void main(String[] args) {
System.out.println(cal(10, 5, "+"));
System.out.println(cal(10, 5, "-"));
System.out.println(cal(10, 5, "*"));
System.out.println(cal(10, 5, "/"));
System.out.println(cal(10, 5, "%"));
}
}
存在问题:每次增加功能,都需要修改已有的代码
基本实现- 类图
- 接口
public interface Calculator {
int cal(Integer num1,Integer num2);
}
- 上下文
public class CalculatorContext {
private Calculator calculator;
public CalculatorContext() {
}
public CalculatorContext(Calculator calculator) {
this.calculator = calculator;
}
public void setCalculator(Calculator calculator) {
this.calculator = calculator;
}
public int cal(Integer num1, Integer num2){
int res = calculator.cal(num1, num2);
return res;
}
}
- 具体功能实现类
public class AddCalculator implements Calculator{
@Override
public int cal(Integer num1, Integer num2) {
return num1+num2;
}
}
public class SubCalculator implements Calculator{
@Override
public int cal(Integer num1, Integer num2) {
return num1 - num2;
}
}
public class MultiCalculator implements Calculator{
@Override
public int cal(Integer num1, Integer num2) {
return num1*num2;
}
}
- 测试代码:
public class DemoTest {
public static void main(String[] args) {
CalculatorContext context = new CalculatorContext();
context.setCalculator(new AddCalculator());
System.out.println(context.cal(10, 5));
context.setCalculator(new SubCalculator());
System.out.println(context.cal(10, 5));
context.setCalculator(new MultiCalculator());
System.out.println(context.cal(10, 5));
}
}
基于lambda实现
- 原理
- 代码
public class DemoTest {
public static int fun(Integer num1, Integer num2, BiFunction bf) {
Integer res = bf.apply(num1, num2);
return res;
}
public static void main(String[] args) {
System.out.println(fun(100, 20, (num1, num2) -> num1 + num2));
System.out.println(fun(100, 20, (num1, num2) -> num1 - num2));
System.out.println(fun(100, 20, (num1, num2) -> num1 * num2));
System.out.println(fun(100, 20, (num1, num2) -> num1 / num2));
}
}