设计模式-结构型模式-过滤器模式(Java)

目录

过滤器模式

实现

具体实现步骤


过滤器模式

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是⼀种设计模式,这种模式允许开发⼈员使⽤不同的标准来过滤⼀组对象,通过逻辑运算以解耦的⽅式把它们连接起来。这种类型的设计模式属于结构型模式,它结合 多个标准来获得单⼀标准。

实现

我们将创建⼀个Person对象、Criteria接⼝和实现了该接⼝的实体类,来过滤Person对象的列表。 CriteriaPatternDemo类使⽤Criteria对象,基于各种标准和它们的结合来过滤Person对象的列表。

具体实现步骤

1.创建⼀个Java项⽬。

2.创建⼀个Person类,在该类上应⽤标准。

package com.设计模式.过滤器模式;
​
public class Person {
    private String name;
    private String gender;
    //婚姻状态:single单身  marital已婚
    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;
    }
}

3.为标准创建⼀个接⼝Criteria。

package com.设计模式.过滤器模式;
​
import java.util.List;
​
/*
* 过滤器接口(标准接口)
* */
public interface Criteria {
    /*
    * 实现符合指定的过滤条件的方法,需要将对应的Person对象以参数的形式进行传递
    * */
    /*
    * 方法表示一个过滤的方法
    * person被过滤的对象
    * 满足条件的对象的集合
    * */
    List<Person> meetCriteria(List<Person> persons);
}

4.创建实现了Criteria接⼝的实体类CriteriaMale。

package com.设计模式.过滤器模式;
​
import java.util.ArrayList;
import java.util.List;
​
/*
* 男性过滤器对应的类
* */
public class CriteriaMale implements Criteria {
​
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> malePerson = new ArrayList<>();
        for (Person p : persons) {
            if (p.getGender().equalsIgnoreCase("male")){
                malePerson.add(p);
            }
        }
        return malePerson;
    }
}

5.创建实现了Criteria接⼝的实体类CriteriaFemale。

package com.设计模式.过滤器模式;
​
import java.util.ArrayList;
import java.util.List;
​
/*
 * 女性过滤器对应的类
 * */
public class CriteriaFemale implements Criteria {
​
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> femalePerson = new ArrayList<>();
        for (Person p : persons) {
            if (p.getGender().equalsIgnoreCase("female")){
                femalePerson.add(p);
            }
        }
        return femalePerson;
    }
}

6.创建实现了Criteria接⼝的实体类CriteriaSingle。

package com.设计模式.过滤器模式;
​
import java.util.ArrayList;
import java.util.List;
​
public class CriteriaSingle implements Criteria{
​
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> singlePerson = new ArrayList<>();
        for (Person p : persons) {
            if (p.getMaritalStatus().equalsIgnoreCase("single")){
                singlePerson.add(p);
            }
        }
        return singlePerson;
    }
}

7.创建实现了Criteria接⼝的实体类AndCriteria。

package com.设计模式.过滤器模式;
​
import java.util.ArrayList;
import java.util.List;
​
/*
 * 已婚状态
 * */
public class AddCriteria implements Criteria{
​
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> maritalPerson = new ArrayList<>();
        for (Person p : persons) {
                if (p.getMaritalStatus().equalsIgnoreCase("marital")){
                maritalPerson.add(p);
            }
        }
        return maritalPerson;
    }
}

8.创建实现了Criteria接⼝的实体类OrCriteria。

package com.设计模式.过滤器模式;
​
import java.util.ArrayList;
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;
    }
​
    @Override
    public List<Person> meetCriteria(List<Person> persons) {
        List<Person> firstPersons = new ArrayList<>();
        List<Person> secondPersons = new ArrayList<>();
        firstPersons = criteria.meetCriteria(persons);
        secondPersons = otherCriteria.meetCriteria(persons);
        for (Person person : secondPersons) {
            if (!firstPersons.contains(person)){
                firstPersons.add(person);
            }
        }
        return firstPersons;
    }
}

9.使⽤不同的标准(Criteria)和它们的结合来过滤Person对象的列表。

package com.设计模式.过滤器模式;
​
import java.util.ArrayList;
import java.util.List;
​
public class FilterPatternDemo {
    public static void main(String[] args) {
        //构建一个List集合,在这个集合中保存不同person信息的对象
        List<Person> personList = new ArrayList<>();
        Person person1 = new Person("赵","male","single");
        Person person2 = new Person("钱","female","single");
        Person person3 = new Person("孙","male","marital");
        Person person4 = new Person("李","male","single");
        Person person5 = new Person("王","female","marital");
        Person person6 = new Person("刘","female","single");
        Person person7 = new Person("张","male","marital");
        personList.add(person1);
        personList.add(person2);
        personList.add(person3);
        personList.add(person4);
        personList.add(person5);
        personList.add(person6);
        personList.add(person7);
​
        //创建一个过滤器对象,(male筛选出来)
        Criteria male = new CriteriaMale();
​
        List<Person> males = male.meetCriteria(personList);
        for (Person p :males) {
            System.out.println(p.getName()+" "+p.getGender()+" "+p.getMaritalStatus());
        }
        System.out.println("----------------------");
        //筛选marital
        Criteria marital = new AddCriteria();
        List<Person> maritals = marital.meetCriteria(personList);
        for (Person p : maritals) {
            System.out.println(p.getName()+" "+p.getGender()+" "+p.getMaritalStatus());
        }
        System.out.println("----------------------");
        //筛选male,marital
        Criteria maleMarital = new OrCriteria(male,marital);
        List<Person> maleMaritals = maleMarital.meetCriteria(personList);
        for (Person p :maleMaritals) {
            System.out.println(p.getName()+" "+p.getGender()+" "+p.getMaritalStatus());
        }
​
    }
}

10.执⾏程序,输出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值