过滤器模式 / 标准模式

基本介绍

1.允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来,它结合多个标准来获得单一标准

 

代码示例

import java.util.LinkedList;
import java.util.List;

public class Filter {//客户端

    public static void main(String[] args) {
        LinkedList<Person> people = new LinkedList<>();
        people.add(new Person("1", "male", "single"));
        people.add(new Person("2", "male", "married"));
        people.add(new Person("3", "female", "single"));
        people.add(new Person("4", "female", "married"));
        Male male = new Male();
        Female female = new Female();
        Single single = new Single();
        Married married = new Married();
        And and = new And(male, single);
        Or or = new Or(female, married);
        System.out.println("性别:男");
        print(male.filtrate(people));
        System.out.println("性别:女");
        print(female.filtrate(people));
        System.out.println("状态:单身");
        print(single.filtrate(people));
        System.out.println("状态:已婚");
        print(married.filtrate(people));
        System.out.println("性别:男 按位与 状态:单身");
        print(and.filtrate(people));
        System.out.println("性别:女 按位或 状态:已婚");
        print(or.filtrate(people));
    }

    public static void print(List<Person> people) {
        for (Person person : people) {
            System.out.println(person.name + " " + person.gender + " " + person.state);
        }
    }
}

class Person {//待过滤对象
    public String name;
    public String gender;
    public String state;

    public Person(String name, String gender, String state) {
        this.name = name;
        this.gender = gender;
        this.state = state;
    }
}

interface Criteria {//标准接口

    List<Person> filtrate(List<Person> people);
}

class Male implements Criteria {//具体标准类

    @Override
    public List<Person> filtrate(List<Person> people) {
        List<Person> males = new LinkedList<>();
        for (Person person : people) {
            if (person.gender.equalsIgnoreCase("male")) {
                males.add(person);
            }
        }
        return males;
    }
}

class Female implements Criteria {//具体标准类

    @Override
    public List<Person> filtrate(List<Person> people) {
        List<Person> females = new LinkedList<>();
        for (Person person : people) {
            if (person.gender.equalsIgnoreCase("female")) {
                females.add(person);
            }
        }
        return females;
    }
}

class Single implements Criteria {//具体标准类

    @Override
    public List<Person> filtrate(List<Person> people) {
        List<Person> females = new LinkedList<>();
        for (Person person : people) {
            if (person.state.equalsIgnoreCase("single")) {
                females.add(person);
            }
        }
        return females;
    }
}

class Married implements Criteria {//具体标准类

    @Override
    public List<Person> filtrate(List<Person> people) {
        List<Person> females = new LinkedList<>();
        for (Person person : people) {
            if (person.state.equalsIgnoreCase("married")) {
                females.add(person);
            }
        }
        return females;
    }
}

class And implements Criteria {//按位与
    private Criteria criteria;
    private Criteria otherCriteria;

    public And(Criteria criteria, Criteria otherCriteria) {
        this.criteria = criteria;
        this.otherCriteria = otherCriteria;
    }

    @Override
    public List<Person> filtrate(List<Person> people) {
        List<Person> firstCriteriaPersons = criteria.filtrate(people);
        return otherCriteria.filtrate(firstCriteriaPersons);
    }
}

class Or implements Criteria {//按位或
    private Criteria criteria;
    private Criteria otherCriteria;

    public Or(Criteria criteria, Criteria otherCriteria) {
        this.criteria = criteria;
        this.otherCriteria = otherCriteria;
    }

    @Override
    public List<Person> filtrate(List<Person> people) {
        List<Person> firstCriteriaItems = criteria.filtrate(people);
        List<Person> otherCriteriaItems = otherCriteria.filtrate(people);

        for (Person person : otherCriteriaItems) {
            if (!firstCriteriaItems.contains(person)) {
                firstCriteriaItems.add(person);
            }
        }
        return firstCriteriaItems;
    }
}

 

posted @   半条咸鱼  阅读(28)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示