1.什么是策略模式?
策略模式代表解决一类算法的通用解决方案,你可以在运行时选择使用哪种方案。
2.策略模式包含三部分:
(1)一个代表某个算法的接口
(2)一个或多个该接口的具体实现,比如声明一个Strategy接口,而后创建实现Strategy接口的类(StrategyA和StratetyB)
(3)一个或多个使用该策略(接口)的客户
3.我们可以先定义一个验证数值大小的接口
public interface Strategy{
boolean execute(int i);
}
而后创建两个实现该接口的类StrategyA和StrategyB:
public class StrategyA implements Strategy{
@override
public boolean execute(int i){
return i>100;
}
}
public class StrategyB implements Strategy{
@override
public boolean execute(int i){
return i>10000;
}
}
不使用Lambda表达式时:
public class Validator{
private final Strategy strategy;
public Validator(Strategy strategy){
this.strategy = strategy;
}
public boolean validate(int i){
return strategy.execute(i);
}
}
Validator validatorA = new Validator(new StrategyA);
boolean resultA = validatorA.validate(500);//500>100; resultA==true
Validator validatorB = new Validator(new StrategyB);
boolean resultB = validatorB.validate(500);//500<10000; resultB == false
使用Lambda表达式时:
我们知道,只定义一个抽象方法的接口是函数式接口。这里的Strategy与谓词Predicate<Integer>拥有相同的函数描述,即
T->boolean,所以我们可以直接使用Lambda表达式来替换可接受相同函数描述符的参数。
Validator validatorA = new Validator((Integer i)->{return i>100;});
boolean resultA = validatorA.validate(500);//返回ture
Validator validatorB = new Validator((Integer i)->{return i>10000;});
boolean resultB = validatorB.validate(500);//返回false
由此可以看出使用Lambda表达式可以不用再创建模板代码,Lambda表达式和谓词Predicate对模板代码已经进行了封装;