1、概念
过滤器设计模式就是一种高级筛选方案,在项目中用的比较广。
2、场景
项目中应用场景(Hibernate中的Criteria 以及mongodb中的Criteria)
2.1、我们在项目中从一百万数据中筛选出来我们都会认为从sql语句中直接筛选就可以,没有什么难得,这句话没错,但是如果我们经常带有条件的查询,但是这些条件都类似,我们为什么不统一的做一个筛选工具类呢?
2.2:、针对上面的场景,项目中开发结合过滤器设计模式开发出了几个工具类,举例说明:Hibernate中的Criteria接口,以及mongodb中的Criteria,我们都可以创建这样的对象对它进行操作,而且项目开发中也经常用到这种方式进行开发,以前hibernate比较火的时候经常用到,虽然最近用不到了,但是mongodb数据库对它数据的增删改差也经常用到。
截图说明下:
这中查询方式相当于sql语句中查询方式,这样不是另外一种简单的查询方式吗,所以我们针对上面的这种接口Criteria也写一个这样的接口,很简单,也是结合别人的博客给大家写一下,但是在此之前还是先要了解下我们开发中的Criteria的结构。
接下来看我们经常使用的那些查询方法
最后它的子类
差不多这个过滤器模式就有一个雏形的结构了,接下来我们自己完成一个。
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);
}
}
}
}
结果
总结:mongodb的过滤器模式与我们自己写的差不多,但是我们其实在项目中也不知道怎么下手,但是我认为最重要的点就是那个实体类,mongodb的实体类就是DBObject,为什么它的实体类是这个呢,因为mongodb数据库的数据是文本数据,以json数据存储,而DBObject可以转换JSONObect或者JsonArray等,所以实体类他用的DBObject,但是我们的自己举例用的是Person,如果项目用到的话可以结合实际,所以我认为这个实体类是一个重点,其他的话大家一看的话就应该很明白了。