过滤器模式 / 标准模式
基本介绍
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;
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战