策略模式

本文通过一个具体的例子,详细讲解了如何在Java中应用策略模式来解决一类问题,即通过定义一个接口和多个其实现类,根据不同策略进行灵活选择,提高代码的复用性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们需要解决同一类问题的时候,若发现这类问题大部分处理过程是一致的,只是核心步骤存在差异,这时候就可以使用以下方式:先把函数相同的部分写好,再抽象出一个接口,不同部分的代码放在接口的实现类中。要使用时,只需将实现类的对象传递给该函数即可。
这种方式在设计模式中称为“策略模式”。

1.函数相同的部分:

public class FilterUtil<T> {
    private FilterProcessor filterProcessor;

    public List<T> filter(List<T> list,FilterProcessor filterProcessor){
        List<T> result=new ArrayList<T>();
        for (T t:list){
            if (filterProcessor.process(t))
                result.add(t);
        }
        return result;
    }
}

2.抽象出一个接口:

public interface FilterProcessor<T>{
    boolean process(T t);
}

3.实现类

public class FilterAgeImpl implements FilterProcessor<Teacher> {
    @Override
    public boolean process(Teacher teacher) {
        if (teacher.getAge()>=30)
            return true;
        return false;
    }
}

4.测试

    public static void main(String[] args) {
        List<Teacher> teachers=new ArrayList<>();
        Teacher t1=new Teacher(1,25,"a");
        Teacher t2=new Teacher(2,29,"b");
        Teacher t3=new Teacher(3,30,"c");
        teachers.add(t1);
        teachers.add(t2);
        teachers.add(t3);

        FilterUtil filterUtil=new FilterUtil();

        List<Teacher> result2=filterUtil.filter(teachers,new FilterAgeImpl());

        for (Teacher teacher: result2){
            System.out.println(teacher.getName()+" age:"+teacher.getAge());
        }
}

5.使用匿名内部类实现策略模式
可以不用写实现类了

 //使用匿名函数过滤年龄大于等于30的
        List<Teacher> result =filterUtil.filter(teachers, new FilterProcessor<Teacher>() {
            @Override
            public boolean process(Teacher teacher) {
                if (teacher.getAge()>=30)
                    return true;
                return false;
            }
        });
//        过滤id大于1的
        List<Teacher> result1 =filterUtil.filter(teachers, new FilterProcessor<Teacher>() {
            @Override
            public boolean process(Teacher teacher) {
                if (teacher.getId()>1)
                    return true;
                return false;
            }
        });
        for (Teacher t:result){
            System.out.println(t.getName()+" age: "+t.getAge());
        }
        for (Teacher t:result1){
            System.out.println(t.getName()+" id:"+t.getId());
        }

6.使用lamdba实现策略模式
使用匿名实现类,可以省去写实现类,但是如果写了很多匿名实现类的话,代码看起来就不是很简洁
将匿名实现类该写成lamdba,看起来就很舒服。这样既不用写实现类了,代码看起来也简洁。

        //使用lamdba表达式过滤年龄大于等于30的
        List<Teacher> result3 =filterUtil.filter(teachers,(o)->{Teacher teacher=(Teacher)o;return teacher.getAge()>=30;});
        //使用lamdba表达式过滤id大于1的
        List<Teacher> result4 =filterUtil.filter(teachers,(o)->{Teacher teacher=(Teacher)o;return teacher.getId()>1;});
        for (Teacher t:result3){
            System.out.println(t.getName()+" age:"+t.getAge());
        }
        for (Teacher t:result4){
            System.out.println(t.getName()+" id:"+t.getId());
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值