Posts 设计模式-过滤器模式
Post
Cancel

设计模式-过滤器模式

概念解析

过滤器模式,即根据某种规则,从一组对象中过滤掉一些不符合要求的对象的过程。主要包含三个角色:

  • 过滤的目标(Target):即要被过滤的对象
  • 过滤器(Filter):负责过滤不需要的对象,一般一个规则对应一个类
  • 过滤器类(FilterChain):过滤器集合,负责管理和维护过滤器。

过滤器模式类图如下:

img

优点:

  • 将对象的过滤、校验逻辑抽离出来,降低系统的复杂度
  • 过滤规则可实现重复利用

缺点:

  • 性能低,每个过滤器需要对每个元素进行遍历:如n个元素,m个过滤器,则复杂度为O(mn)

常用场景:

  • 敏感词过滤/舆情监测
  • 对象列表进行检验、审查或预处理的场景
  • 对网络接口的请求和响应进行拦截

设计模板

过滤器模式的框架模型为:

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
from abc import ABCMeta, abstractmethod


class Filter(metaclass=ABCMeta):
    """过滤器"""
    @abstractmethod
    def do_filter(self, element):
        """过滤方法"""
        pass


def FilterChain(Filter):
    """过滤器链"""
    def __init__(self):
        self._filters = []

    def add_filter(self, filter):
        self._filters.append(filter)

    def remoce_filter(self, filter):
        self._filters.remove(filter)

    def do_filter(self, elements):
        for filter in self._filters:
            elements = filter.do_filter(elements)
        return 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
35
36
37
38
39
40
41
import re


class SensitiveFilter(Filter):
    """敏感词过滤"""
    def __init__(self):
        self.__sensitives = ["黄色", "反动", "贪污"]

    def do_filter(self, elements):
        # 敏感词列表转换成正则表达式
        regex = ""
        for word in self.__sensitives:
            regex += word + "|"
        regex = regex[0 : len(regex) - 1]

        # 对每个元素进行过滤
        new_elements = []
        for element in new_elements:
            item, num = re.sub(regex, "", element)
            new_elements.append(item)
        return new_elements


class HtmlFilter(Filter):
    """HTML特殊字符转换"""
    def __init__(self):
        self.__word_map = {
            "&": "&",
            "'": "'",
            ">": ">",
            "<": "&lt;",
            "\"": "&quot;"
        }

    def do_filter(self, elements):
        new_elements = []
        for element in elements:
            for key, value in self.__word_map.items():
                element = element.replace(key, value)
            new_elements.append(element)
        return new_elements
This post is licensed under CC BY 4.0 by the author.

设计模式-解释模式

设计模式-对象池技术