今天我要介绍的是软件体系结构模式中的管道-过滤器模式。java
1.定义:web
在管道和过滤器软件体系结构中,每一个模块都有一组输入和一组输出。每一个模块从它的输入端接收输入数据流,在其内部通过处理后,按照标准的顺序,将结果数据流送到输出端,以达到传递一组完整的计算结果实例的目的。一般状况下,能够经过对输入数据流进行局部变换,并采用渐增式计算方法,在未处理完全部输入数据之前,就能够产生部分计算结果,并将其送到输出端口(相似于流水线结构)。所以,称这种模块为“过滤器“。在这种结构中,各模块之间的链接器充当了数据流的导管,将一个过滤器的输出传到下一个过滤器的输入端。因此,这种链接器称为“管道”。算法
2.组成数据库
过滤器按照对流经它的数据操做的不一样,可分为3类过滤器:输入过滤器,处理过滤器和输出过滤器。管道做为过滤器之间数据流动的通道的软件部件,它的主要功能是链接各个过滤器,充当过滤器之间数据流的通道。编程
3.优势浏览器
(1)管道-过滤器模型有以下的优势: 设计人员将整个系统的输入输出行为理解为单个过滤器行为的叠加与组合。这样能够将问题分解,化繁为简。服务器
(2)任何两个过滤器,只要它们之间传送的数据遵照共同的规约就能够相链接。每一个过滤器都有本身独立的输入输出接口,若是过滤器间传输的数据遵照其规约,只要用管道将它们链接就能够正常工做。 网络
(3)整个系统易于维护和升级:旧的过滤器能够被替代,新的过滤器能够添加到已有的系统上。软件的易于维护和升级是衡量软件系统质量的重要指标之一,在管道-过滤器模型中,只 要遵照输入输出数据规约,任何一个过滤器均可以被另外一个新的过滤器代替,同时为加强程序功能,能够添加新的过滤器。这样,系统的可维护性和可升级性获得了保证。并发
(4)支持并发执行:每一个过滤器做为一个单独的执行任务, 能够与其它过滤器并发执行。过滤器的执行是独立的,不依赖于其它过滤器的。网站
和面向对象的对比:
面向对象的体系结构的一个明显的缺点是:当一个对象经过过程调用与其它对象交互时,它必须知道其它对象的标识。而当一个对象的标识改变时,须要对全部调用这一方法的对象进行修改。而在管道(过滤器这种体系结构中,过滤器与其它过滤器相链接时没必要知道系统中的其它过滤器。并且当某个过滤器发生改变时,不须要对其余过滤器进行改动。
4.在J2EE中的应用
Servlet 2. 3 提供的 Filter 是管道和过滤器体系构架在 J2EE中的具体应用。经过使用 Filter 为 Web 应用开发者可以在请求到达 Web 资源前截取请求, 进行相应处理; 同理, 也可以在请求资源反馈以前, 截取响应进行处理, 将处理后的结果反馈给客户端。所以, Filter 为某些处理很是复杂的问题, 提供了很好的解决方案。Filter 的工做机制如图 1 所示。
利用过滤器能够预处理请求的特性, 咱们为信息服务平台设计了一个网站访问信息采集模块, 用来跟踪登陆网站用户的一些基本信息, 如登陆 IP 地址、时间、访问过的栏目、页面及文章等, 为网站的访问统计采集原始数据。
信息采集模块由过滤器组件( rstFilter) 、监听器组件( rst-Listener) 和用户访问信息组件( rstList) 三部分组成。信息采集过程主要在过滤器组件的 doFilter( ) 方法中进行采集, 并利用用户信息组件暂存用户访问信息, 经过监听器组件在会话销毁时, 将用户访问信息存入数据库, 以备统计。整个过程用 Rational Rose 的 Sequence 框图表示, 如图 2 所示。
另外, 利用 Filter 咱们还能够实现如下功能:
( 1) 身份验证和受权过滤器。在客户端的请求响应以前,进行身份验证和受权。
( 2) 加密解密过滤器。在客户和服务器端, 实现加密和解密功能, 且只要更改过滤器就能够更改加密算法。
( 3) 压缩和解压缩过滤器。在客户和服务器端, 实现压缩和解压缩功能。
( 4) 转换过滤器。可根据客户端的不一样, 把相同内容转换成不一样的显示方式展示给不一样的用户, 如手机用户和 PC 机用户浏览相同的网页内容, 就须要根据客户端浏览器的不一样, 生成相应格式的数据, 发送给客户端用户。
( 5) 日志记录和审核过滤器。记录客户端发送的请求信息, 以度量资源的访问量及网络的传输量, 或执行访问资源的限额。
5. 基于KWIC 的关键字匹配算法(管道+过滤器模式下实现)
思路:
每一个过滤器处理数据,而后将结果送至下一个过滤器,。要有数据传入,过滤器即开始工做。过滤器之间的数据共享被严格限制在管道传输
四个过滤器:
输入(Input filter):
从数据源读取输入文件,解析格式,将行写入输出管道
移位(CircularShifter filter):循环移位
排序(Alphabetizer filter):
输出(Output filter)
管道:
in_cs pipe
cs_al pipe
al_ou pile
具体代码见:https://blog.csdn.net/l_f0rm4t3d/article/details/27183635
6.过滤器和拦截器的区别
过滤器,是在java web中,你传入的request,response提早过滤掉一些信息,或者提早设置一些参数,而后再传入servlet或者struts的 action进行业务逻辑,好比过滤掉非法url(不是login.do的地址请求,若是用户没有登录都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符
拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法好比动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者作其它业务逻辑的操做),也能够在你调用方法后打印出字符串,甚至在你抛出异常的时候作业务逻辑的操做。