Java设计模式 - 过滤器/标准模式
过滤器模式使用不同的条件过滤对象。
这些标准可以通过逻辑操作链接在一起。
过滤器模式是一种结构型模式。
例子
import java.util.List; import java.util.ArrayList;class Employee {private String name;private String gender;private String retireStatus;public Employee(String name, String gender, String r) {this.name = name;this.gender = gender;this.retireStatus = r;}public String getName() {return name;}public String getGender() {return gender;}public String getRetireStatus() {return retireStatus;}@Overridepublic String toString() {return "Employee [name=" + name + ", gender=" + gender+ ", retireStatus=" + retireStatus + "]";} }interface Criteria {public List<Employee> meetCriteria(List<Employee> persons); }class CriteriaMale implements Criteria {@Overridepublic List<Employee> meetCriteria(List<Employee> persons) {List<Employee> malePersons = new ArrayList<Employee>();for (Employee person : persons) {if (person.getGender().equalsIgnoreCase("MALE")) {malePersons.add(person);}}return malePersons;} }class CriteriaFemale implements Criteria {@Overridepublic List<Employee> meetCriteria(List<Employee> persons) {List<Employee> femalePersons = new ArrayList<Employee>();for (Employee person : persons) {if (person.getGender().equalsIgnoreCase("FEMALE")) {femalePersons.add(person);}}return femalePersons;} }class CriteriaRetire implements Criteria {@Overridepublic List<Employee> meetCriteria(List<Employee> persons) {List<Employee> singlePersons = new ArrayList<Employee>();for (Employee person : persons) {if (person.getRetireStatus().equalsIgnoreCase("YES")) {singlePersons.add(person);}}return singlePersons;} }class AndCriteria implements Criteria {private Criteria criteria;private Criteria otherCriteria;public AndCriteria(Criteria criteria, Criteria otherCriteria) {this.criteria = criteria;this.otherCriteria = otherCriteria;}@Overridepublic List<Employee> meetCriteria(List<Employee> persons) {List<Employee> firstCriteriaPersons = criteria.meetCriteria(persons);return otherCriteria.meetCriteria(firstCriteriaPersons);} }class OrCriteria implements Criteria {private Criteria criteria;private Criteria otherCriteria;public OrCriteria(Criteria criteria, Criteria otherCriteria) {this.criteria = criteria;this.otherCriteria = otherCriteria;}@Overridepublic List<Employee> meetCriteria(List<Employee> persons) {List<Employee> firstCriteriaItems = criteria.meetCriteria(persons);List<Employee> otherCriteriaItems = otherCriteria.meetCriteria(persons);for (Employee person : otherCriteriaItems) {if (!firstCriteriaItems.contains(person)) {firstCriteriaItems.add(person);}}return firstCriteriaItems;} }public class Main {public static void main(String[] args) {List<Employee> persons = new ArrayList<Employee>();persons.add(new Employee("Tom", "Male", "YES"));persons.add(new Employee("Jack", "Male", "NO"));persons.add(new Employee("Jane", "Female", "NO"));persons.add(new Employee("Diana", "Female", "YES"));persons.add(new Employee("Mike", "Male", "NO"));persons.add(new Employee("Bob", "Male", "YES"));Criteria male = new CriteriaMale();Criteria female = new CriteriaFemale();Criteria retire = new CriteriaRetire();Criteria retireMale = new AndCriteria(retire, male);Criteria retireOrFemale = new OrCriteria(retire, female);System.out.println("Males: ");printPersons(male.meetCriteria(persons));System.out.println("Females: ");printPersons(female.meetCriteria(persons));System.out.println("Retire Males: ");printPersons(retireMale.meetCriteria(persons));System.out.println("Retire Or Females: ");printPersons(retireOrFemale.meetCriteria(persons));}public static void printPersons(List<Employee> persons) {for (Employee person : persons) {System.out.println(person);}} }
上面的代码生成以下结果。