设计模式Java语言实现之过滤器模式

2,319 阅读3分钟
原文链接: jdkcb.com

过滤器模式定义:

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

优/缺点:

优点:

  • 简单,解耦,使用方便。

缺点:

  • 查了资料发现这货竟然没什么缺点?算了,日后补充吧

这绝对是我见过的最没存在感的设计模式了。

应用场景:

  • 当需要对某一组对象进行筛选的时候(比如女澡堂只让女生进,男澡堂只让男生进)

应用案例:

  • Spring MVC 中的过滤器,用来过滤掉某些请求。

微剧场:

阿呆上学的时候,有一次需要分组,男生一组,女生一组,没了。

这就没了?你,,你这次也太短了吧

靠,你才短,这个设计模式真的想不出来什么情节帮助你们加深理解啊,因为太容易理解了,直接看代码就能看懂,我是编不出来了。

我太难了

代码实战:

首先新建一个Person,代表班级里每个人物,同时,设置姓名和性别两个属性。

public class Person {
​
​
    private String name;//姓名
    private String gender;//性别
    
    
    public Person(String name, String gender) {
        this.name = name;
        this.gender = gender;
    }
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
​
​
    @Override
    public String toString() {
        return "Person [name=" + name + ", gender=" + gender + "]";
    }
​
​
}
​
​

第二步,老规矩,面向接口编程,新建一个Ifilter对象,规范我们后续过滤器的行为:

public interface IFilter {
    
    public List<Person> filter(List<Person> persons);
    
}

新建两个实现,根据性别过滤相关的对象。

​
public class GirlFilter implements IFilter {
​
    @Override
    public List<Person> filter(List<Person> persons) {
         return persons.stream().filter(person ->
         person.getGender().equals("男")
     ).collect(Collectors.toList());
 }
​
}
​
​
public class BoyFilter implements IFilter {
​
    @Override
    public List<Person> filter(List<Person> persons) {
         return persons.stream().filter(person ->
         person.getGender().equals("男")
     ).collect(Collectors.toList());
 }
    
}
​

你写的是啥过滤器模式,你咋不写个人家那种的,菜就是菜

不要在意这些细节

细节决定成败

我.

测试:

​
public class Test {
    
    public static void main(String[] args) {
        List<Person> persons = new LinkedList<>();
        
        
         for (int i = 0; i < 10 ; i++) {
                if (i<5) {
                    persons.add(new Person(String.valueOf(i), "男"));
                }else {
                    persons.add(new Person(String.valueOf(i), "女"));
                }
            }
         
         
         IFilter boyFilter = new BoyFilter();
        //筛选出男同胞们
         persons = boyFilter.filter(persons);
         persons.forEach(person->System.out.println(person.toString()));
         
        
    }
    
​
}
​

输出:

Person [name=0, gender=男]
Person [name=1, gender=男]
Person [name=2, gender=男]
Person [name=3, gender=男]
Person [name=4, gender=男]

总结:

本篇笔记较为简单的说明了过滤器模式的应用场景及其实现,麻雀虽小五脏俱全,过滤器模式虽然简单,但是因为实际开发中需要过滤的场景还是比较多的,所以经常能看到它的身影,比如最常见的SpringMVC Struts2等web框架都使用了拦截过滤器模式用于拦截某些请求,而其他的就更数不胜数了。毕竟在讲一个设计模式的过程中代码使用了这种设计模式的实现这种情况还是很少见的。

大家好,我是韩数,欢迎大家关注我,我们下篇文章再见。