过滤器模式 / 标准模式
基本介绍
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;
}
}

浙公网安备 33010602011771号