zoukankan      html  css  js  c++  java
  • 过滤器模式

    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

  • 相关阅读:
    Raspberry pi raspbain source mirror
    Raspberry pi 定时天气播报
    Raspberry pi 2 wireless settings.
    MATLAB 图像处理-线性变换和直方图均衡
    求向量组的等价正交单位向量组-施密特正交化 C 语言 算法
    矩阵的逆 C 语言 算法二
    矩阵的逆 C 语言 算法一
    线性方程组 解的判别 与解的结构
    How to install .bundle packages in Ubuntu?
    C 语言期中考试 程序分析
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10688867.html
Copyright © 2011-2022 走看看