java filter 模式_设计模式JAVA语言实现之过滤器模式

本文首发至java技术博客【码上】:码上​jdkcb.com

设计模式开源笔记项目github链接(欢迎star):hanshuaikang/design-pattern-java​github.comd408db5a7517b738c8d774453a4ea38e.png

过滤器模式定义:

过滤器模式(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 filter(List persons);

}

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

public class GirlFilter implements IFilter {

@Override

public List filter(List persons) {

return persons.stream().filter(person ->

person.getGender().equals("男")

).collect(Collectors.toList());

}

}

public class BoyFilter implements IFilter {

@Override

public List filter(List persons) {

return persons.stream().filter(person ->

person.getGender().equals("男")

).collect(Collectors.toList());

}

}

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

不要在意这些细节

细节决定成败

我.

测试:

public class Test {

public static void main(String[] args) {

List 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框架都使用了拦截过滤器模式用于拦截某些请求,而其他的就更数不胜数了。毕竟在讲一个设计模式的过程中代码使用了这种设计模式的实现这种情况还是很少见的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值