设计模式
设计模式简介
看懂UML类图和时序图
UML统一建模语言
UML类图及类图之间的关系
类关系记忆技巧
如何正确使用设计模式
优秀设计的特征
面向对象设计原则
创建型设计模式
工厂模式
抽象工厂模式
简单工厂模式
静态工厂模式(Static Factory)
单例模式
建造者模式
原型模式
结构型设计模式
适配器模式
桥接模式
组合模式
装饰器模式
外观模式
享元模式
代理模式
过滤器模式
注册模式(Registry)
行为型设计模式
责任链模式
命令模式
解释器模式
中介者模式
备忘录模式
迭代器模式
观察者模式
状态模式
策略模式
模板模式
访问者模式
规格模式(Specification)
J2EE 设计模式
MVC 模式
业务代表模式
组合实体模式
数据访问对象模式(DAO模式)
前端控制器模式
拦截过滤器模式
空对象模式
服务定位器模式
传输对象模式
数据映射模式(Data Mapper)
依赖注入模式(Dependency Injection)
流接口模式(Fluent Interface)
其他模式
对象池模式(Pool)
委托模式
资源库模式(Repository)
实体属性值模式(EAV 模式)
反面模式
归纳设计模式
本文档使用 MrDoc 发布
-
+
首页
过滤器模式
> 使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来. ![See the source image](/media/202203/2022-03-05_2202470.6655586373786697.png) 过滤器模式(Filter Pattern)或标准模式、条件模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。 ## 问题 首先,什么是过滤器模式?这种模式生活中比较常见,比如移动推出某项优惠套餐,但是套餐可使用的用户群体有限,必须满足入网 5 年以上这种条件,我们可以将 “入网五年” 作为客户群体的过滤条件,这种就是简单的过滤器模式应用。 又比如,现在的垃圾分类,很多城市从上海开始,已经运行起来,着实让人头大,这种垃圾过滤分类的思想其实本身就是一种过滤模式。再比如我们设计日志系统时,并非所有日志都要收集,而是选择性过滤收集,这种实现了日志过滤的东西本身就是过滤器模式的一种体现。讲了这么多,到底什么是过滤器模式? ## 介绍 - 目的:使用不同标准来过滤一组对象。 - 实现:制定不同的规则来实现过滤,然后对过滤结果进行分组。 ## 结构 ![过滤器类图](/media/202203/2022-03-03_1429300.8056900515049292.png) 简化的过滤器模式有如下的角色: * 抽象过滤器角色(AbstractFilter):负责定义过滤器的实现接口,具体的实现还要具体过滤器角色去参与,客户端可以调用抽象过滤器角色中定义好的方法,将客户端的所有请求委派到具体的实现类去,从而让实现类去处理; * ConcreteFilter(具体过滤器角色):该角色负责具体筛选规则的逻辑实现,最后再返回一个过滤后的数据集合,标准的过滤器只对数据做过滤,当然也可以对集合中的数据做某项处理,再将处理后的集合返回; * Subject(被过滤的主体角色):一个软件系统中可以有一个或多个目标角色,在具体过滤器角色中会对指定感兴趣的目标进行处理,以确保后面的数据确实是我想要的。 ### 管道和过滤器 ![管道和过滤器](/media/202203/2022-03-03_144621_411679.png) 这里的管道,其实比较好理解,就类似于一根根的水管或者一个个的流水线,将一个个的过滤器连接起来,形成一个过滤器链(过滤器链可以携带多个过滤器,并且可以以自定义顺序执行它们),原始数据经过一道道的加工工序,最后形成我们需要的数据或产品。一般情况下我们还存在一个过滤器管理器的角色,过滤器管理器负责管理过滤器和过滤器链。 复杂的过滤器还有会过滤器链和过滤器管理器: * 过滤器(Filter) - 过滤器在请求处理程序执行请求之前或之后,执行某些任务 * 过滤器链(Filter Chain) - 过滤器链带有多个过滤器 * 过滤对象 (Target)- 需要过滤的数据源对象 * 过滤管理器(Filter Manager) - 过滤管理器管理过滤器和过滤器链 * 客户端(Client) - Client 是向 Target 对象发送请求的对象 ### 实例 我们将创建一个 *Person* 对象、*Criteria* 接口和实现了该接口的实体类,来过滤 *Person* 对象的列表。 *CriteriaPatternDemo* ,我们的演示类使用 *Criteria* 对象,基于各种标准和它们的结合来过滤 *Person* 对象的列表。 ![过滤器模式的 UML 图](/media/202203/2022-03-03_1426400.9486901617324726.png) ## 优点 - 它提供了一种根据特定条件过滤对象的方法 - 我们可以随时添加新过滤器,而不会影响客户端的代码 - 我们可以在程序执行期间动态选择过滤器 - 基于建造者模式和过滤器模式的方式简化了过滤业务逻辑 - 过滤器和过滤对象通过接口和泛型的方式抽象,支持各种业务的良好扩展 - 通过动态选择过滤器组合,可复用过滤器和减少重复过滤代码的维护 - 可插拔:过滤器的设计概念要求其是支持可插拔设计的; - 有序性:过滤器是被设计为一组组的过滤装置,要实现数据过滤,就必须有顺序性要求,比如我们要设计编解码过滤器,用户请求过来的 xml 数据会优先通过 xml2json 过滤器进行数据处理,完了再在响应发出前进行相应的 json2xml 过滤处理,以保证客户端交互以 xml 数据格式为准的同时系统内部数据交互还是维持 json 格式不变; - 过滤器的独立性:每种过滤器必须是独立的实体,其状态不受其它过滤器的影响,每个过滤器都有自己独立的数据输入输出接口,只要各个过滤器之间传送的数据遵守共同的规约就可以相连接。 ## 示例代码 ### Java *Filter* ``` public interface Filter { public void execute(String request); } ``` *AuthenticationFilter* ``` public class AuthenticationFilter implements Filter { public void execute(String request){ System.out.println("Authenticating request: " + request); } } ``` *FilterChain* ``` public class FilterChain { private List filters = new ArrayList(); public void addFilter(Filter filter){ filters.add(filter); } public void execute(String request){ for (Filter filter : filters) { filter.execute(request); } } } ``` *FilterManager* ``` public class FilterManager { FilterChain filterChain; public FilterManager(){ filterChain = new FilterChain(); } public void setFilter(Filter filter){ filterChain.addFilter(filter); } public void filterRequest(String request){ filterChain.execute(request); } } ``` *Client* ```java public classClient{ publicstaticvoidmain(String[] args){ FilterManager filterManager = new FilterManager(); filterManager.setFilter(new AuthenticationFilter()); filterManager.setFilter(new DebugFilter()); filterManager.sendRequest("HOME"); } } ```
追风者
2022年3月5日 22:02
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码