概念解析
过滤器模式,即根据某种规则,从一组对象中过滤掉一些不符合要求的对象的过程。主要包含三个角色:
- 过滤的目标(Target):即要被过滤的对象
- 过滤器(Filter):负责过滤不需要的对象,一般一个规则对应一个类
- 过滤器类(FilterChain):过滤器集合,负责管理和维护过滤器。
过滤器模式类图如下:
优点:
- 将对象的过滤、校验逻辑抽离出来,降低系统的复杂度
- 过滤规则可实现重复利用
缺点:
- 性能低,每个过滤器需要对每个元素进行遍历:如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 = {
"&": "&",
"'": "'",
">": ">",
"<": "<",
"\"": """
}
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