过滤模式 - 结构
一、概述
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
二、使用
示例:
package pattern.filter; import lombok.AllArgsConstructor; import lombok.Data; import java.util.ArrayList; import java.util.List; /** * 过滤模式 * @author zls * @date 2020/3/26 */ public class FilterTest { public static void main(String[] args) { List<Person> list = new ArrayList<>(); list.add(new Person("王鸥", 32, "female")); list.add(new Person("宋茜", 32, "female")); list.add(new Person("宋哲", 33, "male")); Sex male = new Male(); Sex female = new Female(); Sex andSex = new AndSex(male, female); // 使用不同的标准进行过滤 male.distinguishSex(list); female.distinguishSex(list); // 使用组合标准进行过滤 andSex.distinguishSex(list); } } /** * 标准接口 */ interface Sex { // 辨别性别的方法 public List<Person> distinguishSex(List<Person> list); } /** * 男人判断标准 */ class Male implements Sex { List<Person> list = new ArrayList<>(); @Override public List<Person> distinguishSex(List<Person> list) { for (Person person: list) { if (person.getSex().equalsIgnoreCase("male")){ System.out.println(person.getName()+"是一个男人!"); list.add(person); } } return list; } } /** * 女人判断标准 */ class Female implements Sex { List<Person> list = new ArrayList<>(); @Override public List<Person> distinguishSex(List<Person> list) { for (Person person: list) { if (person.getSex().equalsIgnoreCase("female")){ System.out.println(person.getName()+"是一个女人!"); list.add(person); } } return list; } } /** * 使用标准组合 */ class AndSex implements Sex { private Sex male; private Sex female; public AndSex(Sex male, Sex female) { this.male = male; this.female = female; } /** * 这里要求既是男人,也是女人,形成了互斥,其实并不恰当。 * 现实中使用时,我们可以在定义其他的标准,然后自己进行组合。 * @param list * @return */ @Override public List<Person> distinguishSex(List<Person> list) { List<Person> males = male.distinguishSex(list); return female.distinguishSex(males); } } /** * 在该类上应用标准 */ @Data @AllArgsConstructor class Person { private String name; private Integer age; private String sex; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现