2021-06-23 22:00  阅读(100)
文章分类:设计模式入门实践 文章标签:设计模式Java 设计模式
©  原文作者:w3cschool 原文地址:https://www.w3cschool.cn

过滤器模式

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

实现

我们将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。

202106232200533231.png

步骤 1

创建一个类,在该类上应用标准。

Person.java

        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;
           }  
        }
    

步骤 2

为标准(Criteria)创建一个接口。

Criteria.java

        import java.util.List;
    
        public interface Criteria {
           public List<Person> meetCriteria(List<Person> persons);
        }
    

步骤 3

创建实现了 Criteria 接口的实体类。

CriteriaMale.java

        import java.util.ArrayList;
        import java.util.List;
    
        public class CriteriaMale implements Criteria {
    
           @Override
           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;
           }
        }
    

CriteriaFemale.java

        import java.util.ArrayList;
        import java.util.List;
    
        public class CriteriaFemale implements Criteria {
    
           @Override
           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;
           }
        }
    

CriteriaSingle.java

        import java.util.ArrayList;
        import java.util.List;
    
        public class CriteriaSingle implements Criteria {
    
           @Override
           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;
           }
        }
    

AndCriteria.java

        import java.util.List;
    
        public class AndCriteria implements Criteria {
    
           private Criteria criteria;
           private Criteria otherCriteria;
    
           public AndCriteria(Criteria criteria, Criteria otherCriteria) {
              this.criteria = criteria;
              this.otherCriteria = otherCriteria; 
           }
    
           @Override
           public List<Person> meetCriteria(List<Person> persons) {
              List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);      
              return otherCriteria.meetCriteria(firstCriteriaPersons);
           }
        }
    

OrCriteria.java

        import java.util.List;
    
        public class OrCriteria implements Criteria {
    
           private Criteria criteria;
           private Criteria otherCriteria;
    
           public OrCriteria(Criteria criteria, Criteria otherCriteria) {
              this.criteria = criteria;
              this.otherCriteria = otherCriteria; 
           }
    
           @Override
           public List<Person> meetCriteria(List<Person> persons) {
              List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
              List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
    
              for (Person person : otherCriteriaItems) {
                 if(!firstCriteriaItems.contains(person)){
                 firstCriteriaItems.add(person);
                 }
              }    
              return firstCriteriaItems;
           }
        }
    

步骤4

使用不同的标准(Criteria)和它们的结合来过滤 Person 对象的列表。

CriteriaPatternDemo.java

        public class CriteriaPatternDemo {
           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"));
    
              Criteria male = new CriteriaMale();
              Criteria female = new CriteriaFemale();
              Criteria single = new CriteriaSingle();
              Criteria singleMale = new AndCriteria(single, male);
              Criteria singleOrFemale = new OrCriteria(single, female);
    
              System.out.println("Males: ");
              printPersons(male.meetCriteria(persons));
    
              System.out.println("\nFemales: ");
              printPersons(female.meetCriteria(persons));
    
              System.out.println("\nSingle Males: ");
              printPersons(singleMale.meetCriteria(persons));
    
              System.out.println("\nSingle Or Females: ");
              printPersons(singleOrFemale.meetCriteria(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()
                    +" ]");
              }
           }      
        }
    

步骤 5

验证输出。

        Males: 
        Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
        Person : [ Name : John, Gender : Male, Marital Status : Married ]
        Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
        Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
    
        Females: 
        Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
        Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
    
        Single Males: 
        Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
        Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
        Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
    
        Single Or Females: 
        Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
        Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
        Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
        Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
        Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
    
点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 过滤器模式
上一篇
桥接模式
下一篇
组合模式