• 过滤器模式


    1.过滤器模式简介
    过滤器模式(Filter Pattern)又称标准模式(Criteria Pattern),用于使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。属于结构型模式,它结合多个标准来获得单一标准。

    2.测试Demo

    import java.util.List;
    import java.util.ArrayList;
    
    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 this.name;
        }
        public String getGender() {
            return this.gender;
        }
        public String getMaritalStatus() {
            return this.maritalStatus;
        }
    }
    
    
    interface Criteria {
        public List<Person> meetCriteria(List<Person> persons);
    }
    
    class MaleCtiteria implements Criteria {
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> maleMeet = new ArrayList<Person>();
            for (Person person : persons) {
                if (person.getGender().equalsIgnoreCase("MALE")) {
                    maleMeet.add(person);
                }
            }
            return maleMeet;
        }
    }
    
    class FemaleCtiteria implements Criteria {
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> femaleMeet = new ArrayList<Person>();
            for (Person person : persons) {
                if (person.getGender().equalsIgnoreCase("FEMALE")) {
                    femaleMeet.add(person);
                }
            }
            return femaleMeet;
        }
    }
    
    
    class SingleCtiteria implements Criteria {
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> singleMeet = new ArrayList<Person>();
            for (Person person : persons) {
                if (person.getMaritalStatus().equalsIgnoreCase("Single")) {
                    singleMeet.add(person);
                }
            }
            return singleMeet;
        }
    }
    
    
    class AndCtiteria implements Criteria {
        private Criteria meetCriteria1;
        private Criteria meetCriteria2;
    
        public AndCtiteria(Criteria meetCriteria1, Criteria meetCriteria2) {
            this.meetCriteria1 = meetCriteria1;
            this.meetCriteria2 = meetCriteria2;
        }
    
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> andMeet = meetCriteria1.meetCriteria(persons);
            andMeet = meetCriteria2.meetCriteria(andMeet);
    
            return andMeet;
        }
    }
    
    
    class OrCtiteria implements Criteria {
        private Criteria selectCriteria1;
        private Criteria selectCriteria2;
    
        public OrCtiteria(Criteria selectCriteria1, Criteria selectCriteria2) {
            this.selectCriteria1 = selectCriteria1;
            this.selectCriteria2 = selectCriteria2;
        }
    
        @Override
        public List<Person> meetCriteria(List<Person> persons) {
            List<Person> selectMeet1 = selectCriteria1.meetCriteria(persons);
            List<Person> selectMeet2 = selectCriteria2.meetCriteria(persons);
    
            for (Person person : selectMeet1) {
                if (!selectMeet2.contains(person)) {
                    selectMeet2.add(person);
                }
            }
    
            return selectMeet2;
        }
    }
    
    
    
    public class MeteriaPatternDemo {
        public static void main(String args[]) {
            List<Person> persons = new ArrayList<Person>();
            persons.add(new Person("Jane", "MALE", "Single"));
            persons.add(new Person("July", "FEMALE", "Married"));
            persons.add(new Person("Kitty", "MALE", "Married"));
            persons.add(new Person("James", "FEMALE", "Single"));
    
            Criteria maleCriteria = new MaleCtiteria();
            Criteria singleCriteria = new SingleCtiteria();
            Criteria andCriteria = new AndCtiteria(maleCriteria, singleCriteria);
            Criteria orCriteria = new OrCtiteria(maleCriteria, singleCriteria);
    
            System.out.println("Male:");
            PrintPerson(maleCriteria.meetCriteria(persons));
    
            System.out.println("Single:");
            PrintPerson(singleCriteria.meetCriteria(persons));
    
            System.out.println("Male and Single:");
            PrintPerson(andCriteria.meetCriteria(persons));
    
            System.out.println("Male or Single:");
            PrintPerson(orCriteria.meetCriteria(persons));
        }
    
    
        public static void PrintPerson(List<Person> persons) {
            for (Person person : persons) {
                System.out.println("name=" + person.getName() + "  " + "gender=" + person.getGender() + "  " + "maritalStatus=" + person.getMaritalStatus());        
            }
        }
    }

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

  • 相关阅读:
    【Java多线程系列四】控制线程执行顺序
    【Java多线程系列随笔二】BlockingQueue
    【Java多线程系列三】实现线程同步的方法
    【Java多线程系列随笔一】浅析 Java Thread.join()
    【Java多线程系列二】Thread类的方法
    【Java多线程系列一】Java实现线程方法
    如何优雅的使用和理解线程池
    spring 中 isolation 和 propagation 详解
    嵊州普及Day6T1
    嵊州普及Day5T4
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10688867.html
Copyright © 2020-2023  润新知