Chinaunix首页 | 论坛 | 博客
  • 博客访问: 278161
  • 博文数量: 83
  • 博客积分: 2393
  • 博客等级: 大尉
  • 技术积分: 640
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-24 15:14
文章分类

全部博文(83)

文章存档

2019年(21)

2011年(5)

2010年(2)

2009年(1)

2008年(9)

2007年(33)

2006年(12)

我的朋友

分类: Java

2019-09-02 23:28:39

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算用解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
实现
我们将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。CriteriaPatternDemo,我们的演示类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。



点击(此处)折叠或打开

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

点击(此处)折叠或打开

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


点击(此处)折叠或打开

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

点击(此处)折叠或打开

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


点击(此处)折叠或打开

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

点击(此处)折叠或打开

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


点击(此处)折叠或打开

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


点击(此处)折叠或打开

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




阅读(1429) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~