設計模式-----過濾器模式


通過菜鳥教程學習的。例子也是來源於菜鳥教程的實例

舉個例子:

現在在你面前有一堆人,你需要做的是就是告訴我下面幾種人分別都有誰

一、篩選標准

第一種:男人

第二種:女人

第三種:單身男人

第四種:所有的女人和所有單身的

你會用什么樣的方式來實現呢?

這個過濾器模式真的就是人如其名,就是過濾,我就把它理解成篩子,

二、我們的准備工作;

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM