概念:https://www.runoob.com/design-pattern/strategy-pattern.html
需求场景:查询出来很多员工信息,
- ??过滤工资大于5000的……
- ?过滤年龄大于50的……
常规思路1:
List<Employee> employees = Arrays.asList(new Employee("张三", 18, new BigDecimal("9999")),
new Employee("李四", 20, new BigDecimal("8888")),
new Employee("翠花", 50, new BigDecimal("7777"))
);
//工资大于5000的
List<Employee> salarys = Lists.newArrayList();
for (Employee item : employees) {
if (item.getSalary().compareTo(new BigDecimal("5000")) <=0) {
continue;
}
salarys.add(item);
}
//年龄大于50岁
List<Employee> ages = Lists.newArrayList();
for (Employee age : employees) {
if (age.getAge().compareTo(50) <= 0) {
continue;
}
ages.add(age);
}
常规思路2:
List<Employee> employees = Arrays.asList(new Employee("张三", 18, new BigDecimal("9999")),
new Employee("李四", 20, new BigDecimal("8888")),
new Employee("翠花", 50, new BigDecimal("7777"))
);
//java8 流的应用
//工资大于5000的
List<Employee> collect = employees.stream().filter(e -> e.getSalary().compareTo(new BigDecimal("5000")) > 0)
.collect(Collectors.toList());
System.out.println(collect);
//年龄大于50岁
List<Employee> collect1 = employees.stream().filter(e -> e.getAge() > 50)
.collect(Collectors.toList());
System.out.println(collect1);
设计模式改造:其实这种场景比较简单,过滤的算法不够复杂,设计模式的优势体现的不是很明显,但这种意识和高度必须得时刻提醒着自己
//策略类
public interface MyPredicate<T> {
public boolean test(T t);
}
//年龄策略的实现类
public class FilterEmployeeByAge implements MyPredicate<Employee>{
@Override
public boolean test(Employee employee) {
return employee.getAge() > 50;
}
}
//工资策略的实现类
public class FilterEmployeeBySalary implements MyPredicate<Employee> {
@Override
public boolean test(Employee o) {
return o.getSalary().compareTo(new BigDecimal("5000")) > 0;
}
}
//测试调用的过程
public class Test {
private MyPredicate myPredicate;
public Test() {
}
public void setMyPredicate(MyPredicate myPredicate) {
this.myPredicate = myPredicate;
}
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("张三", 18, new BigDecimal("9999")),
new Employee("李四", 20, new BigDecimal("8888")),
new Employee("翠花", 50, new BigDecimal("7777"))
);
Test test = new Test();
test.setMyPredicate(new FilterEmployeeBySalary());
test.filterEmployees(employees);
System.out.println(">>>>>>>>薪资" + test.filterEmployees(employees));
test.setMyPredicate(new FilterEmployeeByAge());
test.filterEmployees(employees);
System.out.println(">>>>>>>>年龄" + test.filterEmployees(employees));
}
private List<Employee> filterEmployees(List<Employee> employees){
List<Employee> employs = Lists.newArrayList();
for (Employee item : employees) {
if (myPredicate.test(item)){
employs.add(item);
}
}
return employs;
}
}
?