zoukankan      html  css  js  c++  java
  • 管道-过滤器模式

    今天我要介绍的是软件体系结构模式中的管道-过滤器模式。

    1.定义:

          在管道和过滤器软件体系结构中,每个模块都有一组输入和一组输出。每个模块从它的输入端接收输入数据流,在其内部经过处理后,按照标准的顺序,将结果数据流送到输出端,以达到传递一组完整的计算结果实例的目的。通常情况下,可以通过对输入数据流进行局部变换,并采用渐增式计算方法,在未处理完所有输入数据以前,就可以产生部分计算结果,并将其送到输出端口(类似于流水线结构)。因此,称这种模块为“过滤器“。在这种结构中,各模块之间的连接器充当了数据流的导管,将一个过滤器的输出传到下一个过滤器的输入端。所以,这种连接器称为“管道”。

    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或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

  • 相关阅读:
    入门系列4
    入门系列3
    入门系列2
    入门系列1
    sql进阶-筛选库表中数据为空的表
    sql进阶-删除所有的视图
    sql序列(2) sql语句功能表
    sql序列(5)事务
    sql序列(4)存储过程
    KVM虚拟化介绍
  • 原文地址:https://www.cnblogs.com/qingtianxt/p/9084567.html
Copyright © 2011-2022 走看看