通過菜鳥教程學習的。例子也是來源於菜鳥教程的實例
舉個例子:
現在在你面前有一堆人,你需要做的是就是告訴我下面幾種人分別都有誰
一、篩選標准
第一種:男人
第二種:女人
第三種:單身男人
第四種:所有的女人和所有單身的
你會用什么樣的方式來實現呢?
這個過濾器模式真的就是人如其名,就是過濾,我就把它理解成篩子,
二、我們的准備工作;
1、一個人(Person)
package com.design.filter.model; public class Person { private String name;//姓名 private String gender;//性別 private String maritalStatus;//婚姻狀態 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getMaritalStatus() { return maritalStatus; } public void setMaritalStatus(String maritalStatus) { this.maritalStatus = maritalStatus; } public Person(String name, String gender, String maritalStatus) { super(); this.name = name; this.gender = gender; this.maritalStatus = maritalStatus; } public Person() { super(); } }
2、篩子(Criteria)
當然了,篩子我們總不可能只有一把是吧,一把怎么篩,篩出來都長一樣的,所有,我們准備的篩子得滿足我們的需求呀
篩子你想怎么定義都是可以的,可以實現我們的目的就可以了
第一種:你可以選擇每一個標准定義一個標准,那么定義四個標准
第二種:先定義三個基本的篩子,通過組合的方式,組裝成新的篩子。總共會有五把篩子
我選擇的是第二種
定義篩子接口
package com.design.filter.inter; import java.util.List; import com.design.filter.model.Person; public interface Criteria { public List<Person> meetCriteria(List<Person> persons); }
1、刪選男人的篩子:CriteriaMale
1 package com.design.filter.inter.impl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.design.filter.inter.Criteria; 7 import com.design.filter.model.Person; 8 9 /** 10 * 篩選男人的篩子 11 */ 12 public class CriteriaMale implements Criteria { 13 @Override 14 public List<Person> meetCriteria(List<Person> persons) { 15 List<Person> malePersons = new ArrayList<Person>(); 16 for (Person person : persons) { 17 if(person.getGender().equalsIgnoreCase("MALE")){ 18 malePersons.add(person); 19 } 20 } 21 return malePersons; 22 } 23 24 }
2、篩選女人的篩子:CriterFemale
1 package com.design.filter.inter.impl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.design.filter.inter.Criteria; 7 import com.design.filter.model.Person; 8 9 /** 10 * 篩選女人的篩子 11 */ 12 public class CriteriaFemale implements Criteria { 13 @Override 14 public List<Person> meetCriteria(List<Person> persons) { 15 List<Person> femalePersons = new ArrayList<Person>(); 16 for (Person person : persons) { 17 if(person.getGender().equalsIgnoreCase("FEMALE")){ 18 femalePersons.add(person); 19 } 20 } 21 return femalePersons; 22 } 23 24 }
3、篩選單身的篩子:CriterSingle
1 package com.design.filter.inter.impl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.design.filter.inter.Criteria; 7 import com.design.filter.model.Person; 8 9 /** 10 * 篩選單身的篩子 11 */ 12 public class CriteriaSingle implements Criteria { 13 @Override 14 public List<Person> meetCriteria(List<Person> persons) { 15 List<Person> singlePersons = new ArrayList<Person>(); 16 for (Person person : persons) { 17 if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){ 18 singlePersons.add(person); 19 } 20 } 21 return singlePersons; 22 } 23 }
4、組合單身和男人的篩子得到交集:AndCriteria
1 package com.design.filter.inter.impl; 2 3 import java.util.List; 4 5 import com.design.filter.inter.Criteria; 6 import com.design.filter.model.Person; 7 8 public class AndCriteria implements Criteria { 9 10 private Criteria criteria; 11 private Criteria otherCriteria; 12 13 public AndCriteria(Criteria criteria, Criteria otherCriteria) { 14 this.criteria = criteria; 15 this.otherCriteria = otherCriteria; 16 } 17 18 /** 19 * 第一種標准和第二種標准都滿足的 20 */ 21 @Override 22 public List<Person> meetCriteria(List<Person> persons) { 23 List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);// 第一種方式篩選過再使用另一種方法篩選 24 return otherCriteria.meetCriteria(firstCriteriaPersons); 25 } 26 27 }
5、組合女人和單身的篩子得到並集:OrCriteria
1 package com.design.filter.inter.impl; 2 3 import java.util.List; 4 5 import com.design.filter.inter.Criteria; 6 import com.design.filter.model.Person; 7 8 public class OrCriteria implements Criteria { 9 10 private Criteria criteria; 11 private Criteria otherCriteria; 12 13 public OrCriteria(Criteria criteria, Criteria otherCriteria) { 14 this.criteria = criteria; 15 this.otherCriteria = otherCriteria; 16 } 17 18 /** 19 * 第一種標准或者第二種標准中滿足一個的 20 */ 21 @Override 22 public List<Person> meetCriteria(List<Person> persons) { 23 List<Person> firstCriteriaItems = criteria.meetCriteria(persons);//第一種標准篩選 24 List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);//第二種標准篩選 25 26 for (Person person : otherCriteriaItems) {//遍歷第二種方式篩選的信息 27 if (!firstCriteriaItems.contains(person)) {//如果第一種標准篩選過的人中不存在的,則加入到 28 firstCriteriaItems.add(person); 29 } 30 } 31 return firstCriteriaItems; 32 } 33 }
三、篩選(CriteriaPatternDemo)
1 package com.design.filter; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.design.filter.inter.Criteria; 7 import com.design.filter.inter.impl.AndCriteria; 8 import com.design.filter.inter.impl.CriteriaFemale; 9 import com.design.filter.inter.impl.CriteriaMale; 10 import com.design.filter.inter.impl.CriteriaSingle; 11 import com.design.filter.inter.impl.OrCriteria; 12 import com.design.filter.model.Person; 13 14 public class CriteriaPatternDemo { 15 public static void main(String[] args) { 16 List<Person> persons = new ArrayList<Person>(); 17 18 //一群人 19 persons.add(new Person("Robert", "Male", "Single")); 20 persons.add(new Person("John", "Male", "Married")); 21 persons.add(new Person("Laura", "Female", "Married")); 22 persons.add(new Person("Diana", "Female", "Single")); 23 persons.add(new Person("Mike", "Male", "Single")); 24 persons.add(new Person("Bobby", "Male", "Single")); 25 26 27 Criteria male = new CriteriaMale();//篩選男人 28 Criteria female = new CriteriaFemale();//篩選女人 29 Criteria single = new CriteriaSingle();//篩選單身的 30 Criteria singleMale = new AndCriteria(single, male);//篩選單身的男人 31 Criteria singleOrFemale = new OrCriteria(single, female);//篩選所有的單身的,所有的女人 32 33 System.out.println("Males: "); 34 printPersons(male.meetCriteria(persons)); 35 36 System.out.println("\nFemales: "); 37 printPersons(female.meetCriteria(persons)); 38 39 System.out.println("\nSingle Males: "); 40 printPersons(singleMale.meetCriteria(persons)); 41 42 System.out.println("\nSingle Or Females: "); 43 printPersons(singleOrFemale.meetCriteria(persons)); 44 } 45 46 public static void printPersons(List<Person> persons) { 47 for (Person person : persons) { 48 System.out.println("Person : [ Name : " + person.getName() 49 + ", Gender : " + person.getGender() 50 + ", Marital Status : " + person.getMaritalStatus() + " ]"); 51 } 52 } 53 }