课程表

设计模式课程

工具箱
速查手册

过滤器模式

当前位置:免费教程 » Java相关 » 设计模式

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

实现

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

过滤器模式的 UML 图

步骤 1

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

Person.java

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

步骤 2

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

Criteria.java

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

步骤 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. for (Person person : persons) {
  10. if(person.getGender().equalsIgnoreCase("MALE")){
  11. malePersons.add(person);
  12. }
  13. }
  14. return malePersons;
  15. }
  16. }

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. for (Person person : persons) {
  10. if(person.getGender().equalsIgnoreCase("FEMALE")){
  11. femalePersons.add(person);
  12. }
  13. }
  14. return femalePersons;
  15. }
  16. }

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. for (Person person : persons) {
  10. if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
  11. singlePersons.add(person);
  12. }
  13. }
  14. return singlePersons;
  15. }
  16. }

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. List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
  16. return otherCriteria.meetCriteria(firstCriteriaPersons);
  17. }
  18. }

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

步骤4

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

CriteriaPatternDemo.java

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

步骤 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 ]
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号