• 过滤模式


    一、概述

    过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。

    二、使用

    示例:

    package pattern.filter;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 过滤模式
     * @author zls
     * @date 2020/3/26
     */
    public class FilterTest {
        public static void main(String[] args) {
            List<Person> list = new ArrayList<>();
            list.add(new Person("王鸥", 32, "female"));
            list.add(new Person("宋茜", 32, "female"));
            list.add(new Person("宋哲", 33, "male"));
            Sex male = new Male();
            Sex female = new Female();
            Sex andSex = new AndSex(male, female);
    
            // 使用不同的标准进行过滤
            male.distinguishSex(list);
            female.distinguishSex(list);
            // 使用组合标准进行过滤
            andSex.distinguishSex(list);
    
        }
    }
    
    
    /**
     * 标准接口
     */
    interface Sex {
        // 辨别性别的方法
        public List<Person> distinguishSex(List<Person> list);
    }
    
    /**
     * 男人判断标准
     */
    class Male implements Sex {
        List<Person> list = new ArrayList<>();
        @Override
        public List<Person> distinguishSex(List<Person> list) {
            for (Person person: list) {
                if (person.getSex().equalsIgnoreCase("male")){
                    System.out.println(person.getName()+"是一个男人!");
                    list.add(person);
                }
            }
            return list;
        }
    }
    
    /**
     * 女人判断标准
     */
    class Female implements Sex {
        List<Person> list = new ArrayList<>();
        @Override
        public List<Person> distinguishSex(List<Person> list) {
            for (Person person: list) {
                if (person.getSex().equalsIgnoreCase("female")){
                    System.out.println(person.getName()+"是一个女人!");
                    list.add(person);
                }
            }
            return list;
        }
    }
    
    /**
     * 使用标准组合
     */
    class AndSex implements Sex {
        private Sex male;
        private Sex female;
    
        public AndSex(Sex male, Sex female) {
            this.male = male;
            this.female = female;
        }
    
        /**
         * 这里要求既是男人,也是女人,形成了互斥,其实并不恰当。
         * 现实中使用时,我们可以在定义其他的标准,然后自己进行组合。
         * @param list
         * @return
         */
        @Override
        public List<Person> distinguishSex(List<Person> list) {
            List<Person> males = male.distinguishSex(list);
            return female.distinguishSex(males);
        }
    }
    
    /**
     * 在该类上应用标准
     */
    @Data
    @AllArgsConstructor
    class Person {
        private String name;
        private Integer age;
        private String sex;
    }
  • 相关阅读:
    如何证明Application Domain的隔离性
    Programming clojure – Multimethods
    Kafka: a Distributed Messaging System for Log Processing
    Practical Clojure Parallel Programming
    The Joy of Clojure – Clojure philosophy(1)
    Columnar Storage
    Programming clojure – Concurrency
    Practical clojure – Macros and Metaprogramming
    Linkedin Databus
    Leiningen
  • 原文地址:https://www.cnblogs.com/shiyun32/p/12577771.html
Copyright © 2020-2023  润新知