设计模式-过滤器模式

上文(桥梁模式)https://blog.csdn.net/qq_16498553/article/details/106486273


背景

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

过滤器模式是什么?

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

模式可以干嘛?

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

优点:

简单、方便、解耦;

缺点:

目前没有发现...

类图

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

实现代码

 

/**
 * @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 +
                '}';
    }
}
/**
 * @Auther: csh
 * @Date: 2020/5/25 14:16
 * @Description:分数拦截器
 */
public interface IGradeFilter {
    /** 分数拦截器*/
    List<Student> conditionGradeFilter(List<Student> studentList);
}
/**
 * @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;
    }
}
/**
 * @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;
    }
}
/**
 * @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;
    }
}
/**
 * @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;
    }
}
/**
 * @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;
    }
}
/**
 * @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;
    }
}
Student{realName='0学生', grade=362}
Student{realName='1学生', grade=373}
Student{realName='2学生', grade=208}
Student{realName='3学生', grade=505}
Student{realName='4学生', grade=555}
Student{realName='5学生', grade=527}
Student{realName='6学生', grade=613}
Student{realName='7学生', grade=475}
Student{realName='8学生', grade=383}
Student{realName='9学生', grade=649}
Student{realName='10学生', grade=232}
Student{realName='11学生', grade=724}
Student{realName='12学生', grade=713}
Student{realName='13学生', grade=211}
Student{realName='14学生', grade=321}
Student{realName='15学生', grade=715}
Student{realName='16学生', grade=638}
Student{realName='17学生', grade=534}
Student{realName='18学生', grade=204}
Student{realName='19学生', grade=698}
20个学生!
----------------------------------------
Student{realName='11学生', grade=724}
Student{realName='12学生', grade=713}
Student{realName='15学生', grade=715}
3个1本
-------------------------------------------
Student{realName='6学生', grade=613}
Student{realName='9学生', grade=649}
Student{realName='16学生', grade=638}
Student{realName='19学生', grade=698}
4个2本
-------------------------------------------
Student{realName='3学生', grade=505}
Student{realName='4学生', grade=555}
Student{realName='5学生', grade=527}
Student{realName='7学生', grade=475}
Student{realName='17学生', grade=534}
5个3本
-------------------------------------------
Student{realName='3学生', grade=505}
Student{realName='4学生', grade=555}
Student{realName='5学生', grade=527}
Student{realName='7学生', grade=475}
Student{realName='17学生', grade=534}
5个普通专科

最后

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值