当前位置:   article > 正文

设计模式--第二十六章 过滤器模式_设计模式过滤器链接图

设计模式过滤器链接图

第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录



1. 核心思想

过滤器模式就是根据某种规则,从一组对象中,过滤掉一些不符合要求的对象的过程。

2. UML类图

过滤器模式UML类图

3. 框架代码

from abc import ABC, abstractmethod

class Filter(ABC):
    @abstractmethod
    def doFilter(self, elements):
        pass

class FilterChain(Filter):
    def __init__(self, filters:"list[Filter]"= []) -> None:
        self._filters = filters

    def addFilter(self, filter:Filter):
        self._filters.append(filter)

    def removeFilter(self, filter:Filter):
        self._filters.remove(filter)

    def doFilter(self, elements):
        for filter in self._filters:
            elements = filter.doFilter(elements)
        return elements

class FilterImplA(Filter):
    def doFilter(self, elements):
        return filter(lambda x: x > 0, elements)

class FilterImplB(Filter):
    def doFilter(self, elements):
        return filter(lambda x: x < 10, elements)

if __name__ == "__main__":
    elements = [-10,2,3,10,12,0,-12,-1]
    fc = FilterChain([FilterImplA(), FilterImplB()])
    print(list(fc.doFilter(elements)))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

4. 模型说明

4.1 设计要点

过滤器模式中主要有三个角色,在设计过滤器模式时要找到并区分这些角色。

  1. 过滤的目标(Target):即要被过滤的对象,通常是一个对象数组(对象列表)。
  2. 过滤器(Filter):负责过滤不需要的对象,一般一个规则对应一个类。
  3. 过滤器链(FilterChain):即过滤器的集合,负责管理和维护过滤器,用这个对象进行过滤时,它包含的每一个子过滤器都会进行一次过滤。这个类并不总是必要的,但如果有多个过滤器,有这个类将会带来极大的方便。

4.2 优缺点

  1. 优点
    • 将对象的过滤、校验逻辑抽离出来,降低系统的复杂度。
    • 过滤规则可实现重复利用。
  2. 缺点
    • 性能较低,每个过滤器对每一个元素都会进行遍历,如果有 n n n个元素, m m m个过滤器,则复杂度度为 O ( m n ) O(mn) O(mn)

5. 应用场景

  1. 敏感词过滤、舆情监测。
  2. 需要对对象列表(或数据列表)进行检验、审查或预处理的场景。
  3. 对网络接口的请求和响应进行拦截,例如对每个请求和响应记录日志,以便日后分析。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/482048
推荐阅读
相关标签
  

闽ICP备14008679号