设计模式-过滤器模式

2020-09-18 11:24:20 浏览数 (2)

背景

今年的高考推迟了,每年的高考完后有喜有悲,当然每个人考得的分数不同,所以结果就不用,而一般高校都是有严格的分数界限的,比如211和985、一本、二本、三本、还有普通专科...

过滤器模式是什么?

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

模式可以干嘛?

其实现模式也就是用来做过滤和筛选用的,比如你考700分那肯定是一本或重点大学,当然你也可以选择读不读或选个sb的普通专科;反过来高校也是一样的,你投过来的志愿,正常情况下如果低于分数线直接不录取。

优点:

简单、方便、解耦;

缺点:

目前没有发现...

过滤器模式类图

实现代码

代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/25 14:10
 * @Description:学生
 */
public class Student implements Serializable {
    /** 人名*/
    private String realName;
    /** 分数*/
    private int grade;

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    public Student(String realName, int grade) {
        this.realName = realName;
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Student{"  
                "realName='"   realName   '''  
                ", grade="   grade  
                '}';
    }
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/25 14:16
 * @Description:分数拦截器
 */
public interface IGradeFilter {
    /** 分数拦截器*/
    List<Student> conditionGradeFilter(List<Student> studentList);
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/25 14:26
 * @Description:分数枚举
 */
public enum GradeEnum  {
    ONE_COLLEGE(700,"1本"),
    TWO_COLLEGE(600,"2本"),
    THREE_COLLEGE(400,"3本"),
    COMMON_COLLEGE(200,"普通专科")
    ;

    private int grade;
    private String name;

    GradeEnum(int grade, String name) {
        this.grade = grade;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/25 14:30
 * @Description:最好的大学如 清华、北大等
 */
public class BestUniversityFilter implements  IGradeFilter{
    @Override
    public List<Student> conditionGradeFilter(List <Student> studentList) {
        List<Student> list = new ArrayList <Student>();
        for (Student student : studentList) {
            if(student.getGrade()>=GradeEnum.ONE_COLLEGE.getGrade()){
                list.add(student);
            }
        }
        return list;
    }
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/25 14:30
 * @Description:二本大学
 */
public class SecondUniversityFilter implements  IGradeFilter{
    @Override
    public List<Student> conditionGradeFilter(List <Student> studentList) {
        List<Student> list = new ArrayList <Student>();
        for (Student student : studentList) {
            if(student.getGrade()>=GradeEnum.TWO_COLLEGE.getGrade() && student.getGrade()<GradeEnum.ONE_COLLEGE.getGrade()){
                list.add(student);
            }
        }
        return list;
    }
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/25 14:30
 * @Description:三本大学
 */
public class ThreeUniversityFilter implements  IGradeFilter{
    @Override
    public List<Student> conditionGradeFilter(List <Student> studentList) {
        List<Student> list = new ArrayList <Student>();
        for (Student student : studentList) {
            if(student.getGrade()>=GradeEnum.THREE_COLLEGE.getGrade() && student.getGrade()<GradeEnum.TWO_COLLEGE.getGrade()){
                list.add(student);
            }
        }
        return list;
    }
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/25 14:30
 * @Description:普通专科
 */
public class CommonUniversityFilter implements  IGradeFilter{
    @Override
    public List<Student> conditionGradeFilter(List <Student> studentList) {
        List<Student> list = new ArrayList <Student>();
        for (Student student : studentList) {
            if(student.getGrade()>=GradeEnum.COMMON_COLLEGE.getGrade() && student.getGrade()<GradeEnum.THREE_COLLEGE.getGrade()){
                list.add(student);
            }
        }
        return list;
    }
}
代码语言:javascript复制
/**
 * @Auther: csh
 * @Date: 2020/5/25 14:34
 * @Description:演示
 */
public class Client  {

    public static void main(String[] args) {
        List<Student> students = new ArrayList <Student>();
        for(int i =0;i<20;i  ){
            students.add(new Student(i "学生",getRandom(200,750)));
        }
        for (Student student : students) {
            System.out.println(student);
        }
        System.out.println(students.size() "个学生!");
        System.out.println("----------------------------------------");
        BestUniversityFilter best = new BestUniversityFilter();
        List <Student> bestList = best.conditionGradeFilter(students);
        for (Student student : bestList) {
            System.out.println(student);
        }
        System.out.println(bestList.size() "个" GradeEnum.ONE_COLLEGE.getName());
        System.out.println("-------------------------------------------");
        SecondUniversityFilter second = new SecondUniversityFilter();
        List <Student> secondList = second.conditionGradeFilter(students);
        for (Student student : secondList) {
            System.out.println(student);
        }
        System.out.println(secondList.size() "个" GradeEnum.TWO_COLLEGE.getName());
        System.out.println("-------------------------------------------");
        ThreeUniversityFilter threeFilter = new ThreeUniversityFilter();
        List <Student> threeeList = threeFilter.conditionGradeFilter(students);
        for (Student student : threeeList) {
            System.out.println(student);
        }
        System.out.println(threeeList.size() "个" GradeEnum.THREE_COLLEGE.getName());
        System.out.println("-------------------------------------------");
        ThreeUniversityFilter commonFilter = new ThreeUniversityFilter();
        List <Student> commonList = commonFilter.conditionGradeFilter(students);
        for (Student student : commonList) {
            System.out.println(student);
        }
        System.out.println(threeeList.size() "个" GradeEnum.COMMON_COLLEGE.getName());
    }

    //随机数
    public static int getRandom(int start,int end) {

        int num=(int) (Math.random()*(end-start 1) start);
        return num;
    }
}

最后

该模式非常简单,也很好实现,并且很普遍,在各大框架中都有影子,比如spring mvc中的Filter,还有请求转发中的dispatcher,反正很常用,建议读者在日常开发过程中可以加以实践。

0 人点赞