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;
}
@Override
public String toString() {
return "Employee [name=" + name + ", gender=" + gender
+ ", retireStatus=" + retireStatus + "]";
}
}
interface Criteria {
public List<Employee> meetCriteria(List<Employee> persons);
}
class CriteriaMale implements Criteria {
@Override
public 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 {
@Override
public 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 {
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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);
}
}
}
上面的代码生成以下结果。
Males:
Employee[name= Tom,gender=Male,reyireStatus=YES]
Employee[name= Jack,gender=Male,reyireStatus=NO]
Employee[name= Mike,gender=Male,reyireStatus=NO]
Employee[name= Bob,gender=Male,reyireStatus=YES]
Females:
Employee[name= Jane,gender=Female,reyireStatus=NO]
Employee[name= Diana,gender=Female,reyireStatus=YES]
Retire Males
Employee[name= Tom,gender=Male,reyireStatus=YES]