07@设计模式 -(05) 筛选模式

兄Die,写代码太累了?孤独寂寞冷?还没有女朋友吧?
关注微信公众号(瓠悠笑软件部落),送知识!送知识!送温暖!送工作!送女朋友!插科打诨哟!
huyouxiao.com
筛选模式,也叫做条件模式。这种设计模式可以让开发人员通过使用不同的条件在一个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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值