天天看點

[email protected]設計模式 -(05) 篩選模式

兄Die,寫代碼太累了?孤獨寂寞冷?還沒有女朋友吧?

關注微信公衆号(瓠悠笑軟體部落),送知識!送知識!送溫暖!送工作!送女朋友!插科打诨喲!

[email protected]設計模式 -(05) 篩選模式

篩選模式,也叫做條件模式。這種設計模式可以讓開發人員通過使用不同的條件在一個Set集合的對象中篩選自己想要的,并通過邏輯操作方法以解耦的方式将他們串聯起來。這種設計模式屬于結構型設計模式(structural pattern),本質上就是将多個條件組合成一個條件。

具體實作

我們将建立一個叫Person的類,一個叫Criteria的接口和具體的實作類以實作這個接口,實作類在一組Person對象中去篩選。最後在CriteriaPatternDemo類中編寫調用代碼:使用Criteria對象根據多種條件在一組Person對象執行個體中進行篩選,或者根據這些條件的組合進行篩選。

[email protected]設計模式 -(05) 篩選模式

第一步:建立一個類,這個類所生成的對象将被條件說篩選

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}
           

繼續閱讀