橘子味的心
标题:Java过滤器模式(条件模式)

过滤器模式或条件模式是一种设计模式,使开发人员可以使用不同的条件过滤一组对象,并通过逻辑操作以解耦方式将其链接。 这种类型的设计模式属于结构模式,因为该模式组合多个标准以获得单个标准。

实现实现

我们将创建一个Person对象,Criteria接口和具体类,实现这个接口来过滤Person对象的列表。CriteriaPatternDemo是一个演示类,使用Criteria对象基于各种标准及其组合过滤拥有Person对象的列表(List)。

示例的结构图如下 -

第1步

创建要应用标准的类。

Person.java

  1. public class Person {
  2.  
  3. private String name;
  4. private String gender;
  5. private String maritalStatus;
  6.  
  7. public Person(String name, String gender, String maritalStatus){
  8. this.name = name;
  9. this.gender = gender;
  10. this.maritalStatus = maritalStatus;
  11. }
  12.  
  13. public String getName() {
  14. return name;
  15. }
  16. public String getGender() {
  17. return gender;
  18. }
  19. public String getMaritalStatus() {
  20. return maritalStatus;
  21. }
  22. }
  23. Java

第2步

创建Criteria的接口。

Criteria.java

  1. import java.util.List;
  2.  
  3. public interface Criteria {
  4. public List<Person> meetCriteria(List<Person> persons);
  5. }
  6. Java

第3步

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

CriteriaMale.java

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class CriteriaMale implements Criteria {
  5.  
  6. @Override
  7. public List<Person> meetCriteria(List<Person> persons) {
  8. List<Person> malePersons = new ArrayList<Person>();
  9.  
  10. for (Person person : persons) {
  11. if(person.getGender().equalsIgnoreCase("MALE")){
  12. malePersons.add(person);
  13. }
  14. }
  15. return malePersons;
  16. }
  17. }
  18. Java

CriteriaFemale.java

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class CriteriaFemale implements Criteria {
  5.  
  6. @Override
  7. public List<Person> meetCriteria(List<Person> persons) {
  8. List<Person> femalePersons = new ArrayList<Person>();
  9.  
  10. for (Person person : persons) {
  11. if(person.getGender().equalsIgnoreCase("FEMALE")){
  12. femalePersons.add(person);
  13. }
  14. }
  15. return femalePersons;
  16. }
  17. }
  18. Java

CriteriaSingle.java

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class CriteriaSingle implements Criteria {
  5.  
  6. @Override
  7. public List<Person> meetCriteria(List<Person> persons) {
  8. List<Person> singlePersons = new ArrayList<Person>();
  9.  
  10. for (Person person : persons) {
  11. if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
  12. singlePersons.add(person);
  13. }
  14. }
  15. return singlePersons;
  16. }
  17. }
  18. Java

AndCriteria.java

  1. import java.util.List;
  2.  
  3. public class AndCriteria implements Criteria {
  4.  
  5. private Criteria criteria;
  6. private Criteria otherCriteria;
  7.  
  8. public AndCriteria(Criteria criteria, Criteria otherCriteria) {
  9. this.criteria = criteria;
  10. this.otherCriteria = otherCriteria;
  11. }
  12.  
  13. @Override
  14. public List<Person> meetCriteria(List<Person> persons) {
  15.  
  16. List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
  17. return otherCriteria.meetCriteria(firstCriteriaPersons);
  18. }
  19. }
  20. Java

OrCriteria.java

  1. import java.util.List;
  2.  
  3. public class OrCriteria implements Criteria {
  4.  
  5. private Criteria criteria;
  6. private Criteria otherCriteria;
  7.  
  8. public OrCriteria(Criteria criteria, Criteria otherCriteria) {
  9. this.criteria = criteria;
  10. this.otherCriteria = otherCriteria;
  11. }
  12.  
  13. @Override
  14. public List<Person> meetCriteria(List<Person> persons) {
  15. List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
  16. List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
  17.  
  18. for (Person person : otherCriteriaItems) {
  19. if(!firstCriteriaItems.contains(person)){
  20. firstCriteriaItems.add(person);
  21. }
  22. }
  23. return firstCriteriaItems;
  24. }
  25. }
  26. Java

第4步

使用不同的条件及其组合过滤掉人。

CriteriaPatternDemo.java

  1. public class CriteriaPatternDemo {
  2. public static void main(String[] args) {
  3. List<Person> persons = new ArrayList<Person>();
  4.  
  5. persons.add(new Person("Robert","Male", "Single"));
  6. persons.add(new Person("John", "Male", "Married"));
  7. persons.add(new Person("Laura", "Female", "Married"));
  8. persons.add(new Person("Diana", "Female", "Single"));
  9. persons.add(new Person("Mike", "Male", "Single"));
  10. persons.add(new Person("Bobby", "Male", "Single"));
  11.  
  12. Criteria male = new CriteriaMale();
  13. Criteria female = new CriteriaFemale();
  14. Criteria single = new CriteriaSingle();
  15. Criteria singleMale = new AndCriteria(single, male);
  16. Criteria singleOrFemale = new OrCriteria(single, female);
  17.  
  18. System.out.println("Males: ");
  19. printPersons(male.meetCriteria(persons));
  20.  
  21. System.out.println("\nFemales: ");
  22. printPersons(female.meetCriteria(persons));
  23.  
  24. System.out.println("\nSingle Males: ");
  25. printPersons(singleMale.meetCriteria(persons));
  26.  
  27. System.out.println("\nSingle Or Females: ");
  28. printPersons(singleOrFemale.meetCriteria(persons));
  29. }
  30.  
  31. public static void printPersons(List<Person> persons){
  32.  
  33. for (Person person : persons) {
  34. System.out.println("Person : [ Name : " + person.getName() + ", Gender : " + person.getGender() + ", Marital Status : " + person.getMaritalStatus() + " ]");
  35. }
  36. }
  37. }
  38. Java

第5步

验证输出结果,执行上面的代码得到结果如下 -

  1. Males:
  2. Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
  3. Person : [ Name : John, Gender : Male, Marital Status : Married ]
  4. Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
  5. Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
  6.  
  7. Females:
  8. Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
  9. Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
  10.  
  11. Single Males:
  12. Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
  13. Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
  14. Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
  15.  
  16. Single Or Females:
  17. Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
  18. Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
  19. Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
  20. Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
  21. Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
  22. Java