兄Die,寫代碼太累了?孤獨寂寞冷?還沒有女朋友吧?
關注微信公衆号(瓠悠笑軟體部落),送知識!送知識!送溫暖!送工作!送女朋友!插科打诨喲!
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmL4QDOwITM0gDMxETMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
篩選模式,也叫做條件模式。這種設計模式可以讓開發人員通過使用不同的條件在一個Set集合的對象中篩選自己想要的,并通過邏輯操作方法以解耦的方式将他們串聯起來。這種設計模式屬于結構型設計模式(structural pattern),本質上就是将多個條件組合成一個條件。
具體實作
我們将建立一個叫Person的類,一個叫Criteria的接口和具體的實作類以實作這個接口,實作類在一組Person對象中去篩選。最後在CriteriaPatternDemo類中編寫調用代碼:使用Criteria對象根據多種條件在一組Person對象執行個體中進行篩選,或者根據這些條件的組合進行篩選。
第一步:建立一個類,這個類所生成的對象将被條件說篩選
Person.java
package com.patterns.filter;
public class Person {
private String name;
private String gender;
private String maritalStatus;
public Person(String name, String gender, String maritalStatus) {
this.name = name;
this.gender = gender;
this.maritalStatus = 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;
}
@Override
public String toString() {
return "Person{" + "name=" + name + ", gender=" + gender + ", maritalStatus=" + maritalStatus + '}';
}
}
第二步:建立一個叫做Criteria的接口
Criteria.java
package com.patterns.filter;
import java.util.List;
public interface Criteria {
public List<Person> meetCriteria(List<Person> persons);
}
第三步:建立實作類,實作Criteria接口
CriteriaMale.java
package com.patterns.filter;
import java.util.ArrayList;
import java.util.List;
public class CriteriaMale implements Criteria{
public List<Person> meetCriteria(List<Person> persons) {
List<Person> malePersons =new ArrayList<Person>();
for(Person person : persons)
{
if(person.getGender().equalsIgnoreCase("MALE"))
{
malePersons.add(person);
}
}
return malePersons;
}
}
CriteriaFemale.java
package com.patterns.filter;
import java.util.ArrayList;
import java.util.List;
public class CriteriaFemale implements Criteria{
public List<Person> meetCriteria(List<Person> persons) {
List<Person> femalePersons = new ArrayList<Person>();
for(Person person:persons)
{
if(person.getGender().equalsIgnoreCase("FEMALE"))
{
femalePersons.add(person);
}
}
return femalePersons;
}
}
CriteriaSingle.java
package com.patterns.filter;
import java.util.ArrayList;
import java.util.List;
public class CriteriaSingle implements Criteria{
public List<Person> meetCriteria(List<Person> persons) {
List<Person> singlePersons = new ArrayList<Person>();
for(Person person : persons)
{
if(person.getMaritalStatus().equalsIgnoreCase("SINGLE"))
{
singlePersons.add(person);
}
}
return singlePersons;
}
}
AndCriteria.java
package com.patterns.filter;
import java.util.List;
public class AndCriteria implements Criteria{
private Criteria criteria;
private Criteria otherCriteria;
public AndCriteria(Criteria criteria,Criteria otherCriteria)
{
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
return otherCriteria.meetCriteria(firstCriteriaPersons);
}
}
OrCriteria.java
package com.patterns.filter;
import java.util.List;
public class OrCriteria implements Criteria{
private Criteria criteria;
private Criteria otherCriteria;
public OrCriteria(Criteria criteria,Criteria otherCriteria)
{
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
public List<Person> meetCriteria(List<Person> persons) {
List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
for(Person person : otherCriteriaItems)
{
if(!firstCriteriaItems.contains(person))
{
firstCriteriaItems.add(person);
}
}
return firstCriteriaItems;
}
}
第四步:使用不同的條件和不同條件的疊加來篩選出想要的對象
CriteriaPatternDemo.java
package com.patterns.filter;
import java.util.ArrayList;
import java.util.List;
public class CriteriaPatternDemo {
public static void printPersons(List<Person> persons)
{
for(Person person:persons)
{
System.out.println(person.toString());
}
}
public static void main(String args[])
{
List<Person> persons =new ArrayList<Person>();
persons.add(new Person("Robert","Male","Single"));
persons.add(new Person("John","Male","Married"));
persons.add(new Person("Laura","Female","Married"));
persons.add(new Person("Diana","Female","Single"));
persons.add(new Person("Mike","Male","Single"));
persons.add(new Person("Bobby","Male","Single"));
Criteria male =new CriteriaMale();
Criteria female =new CriteriaFemale();
Criteria single =new CriteriaSingle();
Criteria singleMale =new AndCriteria(single, male);
Criteria singleOrFemale =new OrCriteria(single, female);
System.out.println("Males: ");
printPersons(male.meetCriteria(persons));
System.out.println("\nFemales: ");
printPersons(female.meetCriteria(persons));
System.out.println("\nSingle Males: ");
printPersons(singleMale.meetCriteria(persons));
System.out.println("\nSingle Or Females: ");
printPersons(singleOrFemale.meetCriteria(persons));
}
}
第五步:驗證輸出
Males:
Person{name=Robert, gender=Male, maritalStatus=Single}
Person{name=John, gender=Male, maritalStatus=Married}
Person{name=Mike, gender=Male, maritalStatus=Single}
Person{name=Bobby, gender=Male, maritalStatus=Single}
Females:
Person{name=Laura, gender=Female, maritalStatus=Married}
Person{name=Diana, gender=Female, maritalStatus=Single}
Single Males:
Person{name=Robert, gender=Male, maritalStatus=Single}
Person{name=Mike, gender=Male, maritalStatus=Single}
Person{name=Bobby, gender=Male, maritalStatus=Single}
Single Or Females:
Person{name=Robert, gender=Male, maritalStatus=Single}
Person{name=Diana, gender=Female, maritalStatus=Single}
Person{name=Mike, gender=Male, maritalStatus=Single}
Person{name=Bobby, gender=Male, maritalStatus=Single}
Person{name=Laura, gender=Female, maritalStatus=Married}