设计模式之过滤器模式

 

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式

这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

应用场景:

               比如消息过滤,日志过滤。

特点:

                清除不需要的内容

UML图

下面是类实现

定义过滤的对象

一个普通的类

/**
 * 这是要过滤的对象
 */
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 String getGender() {
        return gender;
    }

    public String getMaritalStatus() {
        return maritalStatus;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", gender=" + gender
                + ", maritalStatus=" + maritalStatus + "]";
    }

}

 

过滤器接口定义

/**
 * 这个过滤器的标准接口
 * 
 * @author admin
 * 
 */
public interface Criteria {
    //加入要过滤的对象
    public List<Person> meetCriteria(List<Person> persons);
}

实现着这个过滤器接口

//具体过滤类
public class CriteriaFemale implements Criteria {

    @Override
    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;
    }

}

另一类型过滤器

/**
 * 过滤的具体实现类
 * @author admin
 *
 */
public class CriteriaMale implements Criteria {

    @Override
    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;
    }

}

测试类

public class Main {
    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"));
        // 初始化 2种过滤类(其实就是设置不同过滤规则)
        Criteria male = new CriteriaMale();
        Criteria female = new CriteriaFemale();
        //传入过滤器中
        System.out.println("Males: ");
        System.out.println(male.meetCriteria(persons).toString());
        System.out.println("\nFemales: ");
        System.out.println(female.meetCriteria(persons).toString());
    }
}

结果:

总结

创建过滤接口,实现接口。要使用那种过滤规则就初始化那种对象,然后将要过滤对象放入其中就可以了。

面向接口编程,将对象过滤,接口不依赖对象;对象无入侵,每次只需要增加规则就行了,不用修改过滤对象类。

实例:https://www.cnblogs.com/huangxincheng/p/6415393.html

参考来源:http://www.runoob.com/design-pattern/filter-pattern.html