ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

过滤器模式

2021-06-13 23:36:03  阅读:149  来源: 互联网

标签:meetCriteria List 模式 persons Criteria 过滤器 new public


定义:

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

类图:

 

 这张图是网络摘的,基本上就是按这张图写的:

接口:

public interface Criteria {
    List<Person> meetCriteria(List<Person> persons);
}

各种实现类,多列举了几个:

public class GirlCriteria implements Criteria{
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> girlPersons = new ArrayList<>();
        for (Person person : persons) {
            if(person.getGender().equals("GIRL")) {
                girlPersons.add(person);
            }
        }
        return girlPersons;
    }
}
public class BoyCriteria implements Criteria {
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> boyPersons = new ArrayList<>();
        for (Person person : persons) {
            if(person.getGender().equals("BOY")) {
                boyPersons.add(person);
            }
        }
        return boyPersons;
    }
}
public class SingleCriteria implements Criteria {
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> singlePersons = new ArrayList<>();
        for (Person person : persons) {
            if(person.getStatus().equals("SINGLE")) {
                singlePersons.add(person);
            }
        }
        return singlePersons;
    }
}
//同时满足这两个条件的
public class AndCriteria implements Criteria {
    private Criteria c1;
    private Criteria c2;
    public AndCriteria (Criteria c1, Criteria c2) {
        this.c1 = c1;
        this.c2 = c2;
    }

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> c1Person = c1.meetCriteria(persons);
        List<Person> andPerson = c2.meetCriteria(c1Person);
        return andPerson;
    }
}
// 满足条件之一的
public class OrCriteria implements Criteria {
    private Criteria c1;
    private Criteria c2;

    public OrCriteria(Criteria c1, Criteria c2) {
        this.c1 = c1;
        this.c2 = c2;
    }

    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> list1 = c1.meetCriteria(persons);
        List<Person> list2 = c2.meetCriteria(persons);
        for (Person person : list2) {
            if (!list1.contains(person)) {
                list1.add(person);
            }
        }
        return list1;
    }
}

测试类:

public class TestCriteria {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person("Robert", "BOY", "SINGLE"));
        persons.add(new Person("John", "BOY", "MARRIED"));
        persons.add(new Person("Laura", "GIRL", "MARRIED"));
        persons.add(new Person("Diana", "GIRL", "SINGLE"));
        persons.add(new Person("Mike", "BOY", "SINGLE"));
        persons.add(new Person("Bobby", "BOY", "SINGLE"));

        // 过滤只有BOY的
        System.out.println("boy:");
        List<Person> list1 = new BoyCriteria().meetCriteria(persons);
        printList(list1);

        // 过滤只有GIRL的
        System.out.println("girl:");
        List<Person> list2 = new GirlCriteria().meetCriteria(persons);
        printList(list2);

        // 过滤只有SINGLE的
        System.out.println("single:");
        List<Person> list3 = new SingleCriteria().meetCriteria(persons);
        printList(list3);

        // 过滤BOY并且SINGLE的
        System.out.println("boy and single:");
        BoyCriteria c1 = new BoyCriteria();
        SingleCriteria c2 = new SingleCriteria();
        List<Person> list4 = new AndCriteria(c1, c2).meetCriteria(persons);
        printList(list4);

        // 过滤GIRL或者SINGLE的
        GirlCriteria c3 = new GirlCriteria();
        SingleCriteria c4 = new SingleCriteria();
        System.out.println("girl or single:");
        List<Person> list5 = new OrCriteria(c3, c4).meetCriteria(persons);
        printList(list5);
    }

    public static void printList(List<Person> list) {
        for (Person person : list) {
            System.out.println(person);
        }
    }
}

测试结果:

 

标签:meetCriteria,List,模式,persons,Criteria,过滤器,new,public
来源: https://www.cnblogs.com/dayanjing/p/14881530.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有