java过滤器设计_掌握Java设计模式之过滤器设计模式(13)

1、概念

过滤器设计模式就是一种高级筛选方案,在项目中用的比较广。

2、场景

项目中应用场景(Hibernate中的Criteria 以及mongodb中的Criteria)

2.1、我们在项目中从一百万数据中筛选出来我们都会认为从sql语句中直接筛选就可以,没有什么难得,这句话没错,但是如果我们经常带有条件的查询,但是这些条件都类似,我们为什么不统一的做一个筛选工具类呢?

2.2:、针对上面的场景,项目中开发结合过滤器设计模式开发出了几个工具类,举例说明:Hibernate中的Criteria接口,以及mongodb中的Criteria,我们都可以创建这样的对象对它进行操作,而且项目开发中也经常用到这种方式进行开发,以前hibernate比较火的时候经常用到,虽然最近用不到了,但是mongodb数据库对它数据的增删改差也经常用到。

截图说明下:

0f0af9b15cd7c4ba86ef8475dd988bdb.png

这中查询方式相当于sql语句中查询方式,这样不是另外一种简单的查询方式吗,所以我们针对上面的这种接口Criteria也写一个这样的接口,很简单,也是结合别人的博客给大家写一下,但是在此之前还是先要了解下我们开发中的Criteria的结构。

895d568103931d92547ead25feaf0cb6.png

接下来看我们经常使用的那些查询方法

5f255eeefeae978f465bd74f16102115.png

最后它的子类

5d0a8a96d4916da661c269602b8ec38c.png

差不多这个过滤器模式就有一个雏形的结构了,接下来我们自己完成一个。

3、代码实现

这个是仿照的大部分别人的博客,一会我会给你们讲一下自己写的代码与源码的过滤器模式之间的精髓。

实体类Person

public class Person {

private String name; // 姓名

private String gender; // 性别

private String marital; // 婚姻情况

public Person(String name, String gender, String marital) {

this.name = name;

this.gender = gender;

this.marital = marital;

}

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;

}

public String getMarital() {

return marital;

}

public void setMarital(String marital) {

this.marital = marital;

}

@Override

public String toString() {

return "Person [name=" + name + ",gender=" + gender + ", marital=" + marital + "]";

}

}

接口

public interface Filter {

// 根据传过来的Person列表,根据一定的条件过滤,得到目标集合

List filter(List persons);

}

实现接口,每个过滤条件有多个,我只写了一个,举一反三

public class MaleFilter implements Filter {

public List filter(List persons) {

List result = new ArrayList<>();

for (Person person : persons) {

if ("MALE".equalsIgnoreCase(person.getGender())) {

result.add(person);

}

}

return result;

}

}

main函数实现

import java.util.Arrays;

import java.util.List;

public class Main {

public static void main(String[] args){

List list = Arrays.asList(

new Person("霍一", "FEMALE", "MARRIED"),

new Person("邓二", "MALE", "MARRIED"),

new Person("张三", "MALE", "SINGLE"),

new Person("李四", "FEMALE", "MARRIED"),

new Person("王五", "MALE", "SINGLE"),

new Person("赵六", "FEMALE", "SINGLE"),

new Person("孙七", "MALE", "SINGLE"),

new Person("罗八", "MALE", "MARRIED"),

new Person("刘九", "FEMALE", "SINGLE"),

new Person("史十", "FEMALE", "SINGLE")

);

// 打印出所有男性的信息

System.out.println("---------------------所有男性---------------------");

List maleList = new MaleFilter().filter(list);

if (maleList != null && maleList.size()>0){

for (Person person :maleList){

System.out.println(person);

}

}

}

}

结果

5875894aedcf3bc4cf11ca8103d1e754.png

总结:mongodb的过滤器模式与我们自己写的差不多,但是我们其实在项目中也不知道怎么下手,但是我认为最重要的点就是那个实体类,mongodb的实体类就是DBObject,为什么它的实体类是这个呢,因为mongodb数据库的数据是文本数据,以json数据存储,而DBObject可以转换JSONObect或者JsonArray等,所以实体类他用的DBObject,但是我们的自己举例用的是Person,如果项目用到的话可以结合实际,所以我认为这个实体类是一个重点,其他的话大家一看的话就应该很明白了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值