Java Filter Pattern(过滤器模式)

简介: 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。

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

  1. 创建一个类,在该类上应用标准。
/**
 * 1. 创建一个类,在该类上应用标准。
 * @author mazaiting
 */
public class Person {
    private String name;
    private String gender;
    private String maritalStatus;
    
    public Person(String name, String gender, String maritalStatus) {
        this.name = name;
        this.gender = gender;
        this.maritalStatus = maritalStatus;
    }

    public String getName() {
        return name;
    }

    public String getGender() {
        return gender;
    }

    public String getMaritalStatus() {
        return maritalStatus;
    }   
}
  1. 为标准(Criteria)创建一个接口。
/**
 * 2. 为标准(Criteria)创建一个接口
 * @author mazaiting
 */
public interface Critertia {
    /**男性*/
    public static final String MALE = "MALE";
    /**女性*/
    public static final String FEMALE = "FEMALE";
    /**单身*/
    public static final String SINGLE = "SINGLE";
    
    /**
     * 获取指定的人群
     * @param persons
     */
    public List<Person> meetCriteria(List<Person> persons);
}
  1. 创建实现了 Criteria 接口的实体类。
/**
 * 3. 创建实现了 Criteria 接口的实体类--过滤男性。
 * @author mazaiting
 */
public class CriteriaMale implements Critertia{

    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> malePersons = new ArrayList<Person>();
        for (Person person : persons) {
            if (person.getGender().equalsIgnoreCase(MALE)){
                malePersons.add(person);
            }
        }
        return malePersons;
    }

}

/**
 * 3. 创建实现了 Criteria 接口的实体类。--过滤女性
 * @author mazaiting
 */
public class CriteriaFemale implements Critertia{

    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> femalePersons = new ArrayList<Person>();
        for (Person person : persons) {
            if (person.getGender().equalsIgnoreCase(FEMALE)){
                femalePersons.add(person);
            }
        }
        return femalePersons;
    }

}

/**
 * 3. 创建实现了 Criteria 接口的实体类。--过滤单身
 * @author mazaiting
 */
public class CriteriaSingle implements Critertia{

    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> singlePersons = new ArrayList<Person>();
        for (Person person : persons) {
            if (person.getMaritalStatus().equalsIgnoreCase(SINGLE)){
                singlePersons.add(person);
            }
        }
        return singlePersons;
    }

}

/**
 * 3. 创建实现了 Criteria 接口的实体类。--双重过滤
 * @author mazaiting
 */
public class AndCriteria implements Critertia{

    private Critertia critertia;
    private Critertia otherCritertia;
    
    public AndCriteria(Critertia critertia, Critertia otherCriteria) {
        this.critertia = critertia;
        this.otherCritertia = otherCriteria;
    }
    
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> firstCriteriaPersons = critertia.meetCriteria(persons);
        return otherCritertia.meetCriteria(firstCriteriaPersons);
    }

}

/**
 * 3. 创建实现了 Criteria 接口的实体类。--或过滤
 * @author mazaiting
 */
public class OrCriteria implements Critertia{

    private Critertia critertia;
    private Critertia otherCritertia;
    
    public OrCriteria(Critertia critertia, Critertia otherCritertia) {
        this.critertia = critertia;
        this.otherCritertia = otherCritertia;
    }
    
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> firstCriteriaItems = critertia.meetCriteria(persons);
        List<Person> otherCriteriaItems = otherCritertia.meetCriteria(persons);
        
        for (Person person : otherCriteriaItems) {
            if (!firstCriteriaItems.contains(person)) {
                firstCriteriaItems.add(person);
            }
        }
        
        return firstCriteriaItems;
    }

}
  1. 主函数验证
public class Client {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<Person>();

        persons.add(new Person("Robert", "Male", "Single"));
        persons.add(new Person("John", "Male", "Married"));
        persons.add(new Person("Laura", "Female", "Married"));
        persons.add(new Person("Diana", "Female", "Single"));
        persons.add(new Person("Mike", "Male", "Single"));
        persons.add(new Person("Bobby", "Male", "Single"));
        
        Critertia male = new CriteriaMale();
        Critertia single = new CriteriaSingle();
        Critertia critertia = new AndCriteria(male, single);
        
        List<Person> meetCriteria = critertia.meetCriteria(persons);
        printPersons(meetCriteria);
        
    }
    
    /**
     * 打印数据
     * @param persons
     */
    public static void printPersons(List<Person> persons){
          for (Person person : persons) {
             System.out.println("Person : [ Name : " + person.getName() 
                +", Gender : " + person.getGender() 
                +", Marital Status : " + person.getMaritalStatus()
                +" ]");
          }
       } 
}
  1. 打印结果
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
目录
相关文章
|
17天前
|
监控 Java 数据管理
java会话跟踪和拦截器过滤器
本文介绍了Web开发中的会话跟踪技术——Cookie与Session,以及过滤器(Filter)和监听器(Listener)的概念和应用。Cookie通过在客户端记录信息来识别用户,而Session则在服务器端保存用户状态。过滤器用于拦截和处理请求及响应,监听器则监控域对象的状态变化。文章详细解释了这些技术的实现方式、应用场景和主要方法,帮助开发者更好地理解和使用这些工具。
34 1
|
2月前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
65 11
|
2月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
3月前
|
消息中间件 Java
【实战揭秘】如何运用Java发布-订阅模式,打造高效响应式天气预报App?
【8月更文挑战第30天】发布-订阅模式是一种消息通信模型,发送者将消息发布到公共队列,接收者自行订阅并处理。此模式降低了对象间的耦合度,使系统更灵活、可扩展。例如,在天气预报应用中,`WeatherEventPublisher` 类作为发布者收集天气数据并通知订阅者(如 `TemperatureDisplay` 和 `HumidityDisplay`),实现组件间的解耦和动态更新。这种方式适用于事件驱动的应用,提高了系统的扩展性和可维护性。
70 2
|
3月前
|
存储 JSON 前端开发
【Java】用@JsonFormat(pattern = “yyyy-MM-dd“)注解,出生日期竟然年轻了一天
在实际项目中,使用 `@JsonFormat(pattern = &quot;yyyy-MM-dd&quot;)` 注解导致出生日期少了一天的问题,根源在于夏令时的影响。本文详细解析了夏令时的概念、`@JsonFormat` 注解的使用方法,并提供了三种解决方案:在注解中添加 `timezone = GMT+8`、修改 JVM 参数 `-Duser.timezone=GMT+08`,以及使用 `timezone = Asia/Shanghai
360 0
【Java】用@JsonFormat(pattern = “yyyy-MM-dd“)注解,出生日期竟然年轻了一天
|
3月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
2月前
|
监控 前端开发 Java
Java里的过滤器和拦截器是什么原理,如何选择?
Java里的过滤器和拦截器是什么原理,如何选择?
31 0
|
2月前
|
JSON Java UED
uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现
以上展示了使用Java结合DCloud的uni-push进行在线消息推送的基本步骤和实现方法。实际部署时,可能需要依据实际项目的规模,业务场景及用户基数进行必要的调整和优化,确保消息推送机制在保证用户体验的同时也满足业务需求。
188 0
|
3月前
|
安全 Java API
Java 8 流库的魔法革命:Filter、Map、FlatMap 和 Optional 如何颠覆编程世界!
【8月更文挑战第29天】Java 8 的 Stream API 通过 Filter、Map、FlatMap 和 Optional 等操作,提供了高效、简洁的数据集合处理方式。Filter 用于筛选符合条件的元素;Map 对元素进行转换;FlatMap 将多个流扁平化合并;Optional 安全处理空值。这些操作结合使用,能够显著提升代码的可读性和简洁性,使数据处理更为高效和便捷。
132 0
|
Java 索引 API
java Pattern和Matcher详解
结论:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一种最基础最简单的匹配。 java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(
1537 0
下一篇
无影云桌面