设计模式-策略模式

概念:https://www.runoob.com/design-pattern/strategy-pattern.html

需求场景:查询出来很多员工信息,

  1.   过滤工资大于5000的……
  2.  过滤年龄大于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;
    }
}

工厂模式改造上面的调用方式

public class EmployeeServicesFactory {

    private static final Map<String, MyPredicate> map = new HashMap<>();

    static {
        map.put("age", new FilterEmployeeByAge());
        map.put("salary", new FilterEmployeeBySalary());
    }

    public static MyPredicate getMyPredicate(String str) {
        return map.get(str);
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值