过滤器模式包含以下主要角色:
1. 过滤器接口(Filter): 定义了过滤器的接口,包括一个过滤方法。
2. 具体过滤器类(ConcreteFilter): 实现了过滤器接口,包含了具体的过滤逻辑。
3. 目标类(Target): 表示要过滤的对象集合。
4. 具体目标类(ConcreteTarget): 实现了目标类接口,表示实际的对象集合。
5. 客户端(Client): 使用过滤器来过滤目标对象集合的类。
下面是一个使用过滤器模式的简单例子,假设我们有一个表示人的类,我们想根据不同的条件来过滤人的集合:
# 过滤器接口
class Filter:
def filter(self, persons):
pass
# 具体过滤器类:过滤年龄大于等于18岁的人
class AdultFilter(Filter):
def filter(self, persons):
return [person for person in persons if person.age >= 18]
# 具体过滤器类:过滤名字以特定字符开头的人
class NameFilter(Filter):
def __init__(self, prefix):
self.prefix = prefix
def filter(self, persons):
return [person for person in persons if person.name.startswith(self.prefix)]
# 目标类:人
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 具体目标类:人的集合
class PersonsCollection:
def __init__(self):
self.persons = []
def add_person(self, person):
self.persons.append(person)
# 客户端代码
if __name__ == "__main__":
# 创建具体目标类对象
persons_collection = PersonsCollection()
persons_collection.add_person(Person("Alice", 25))
persons_collection.add_person(Person("Bob", 17))
persons_collection.add_person(Person("Charlie", 30))
# 创建具体过滤器对象
adult_filter = AdultFilter()
name_filter = NameFilter("A")
# 使用过滤器过滤人的集合
adults = adult_filter.filter(persons_collection.persons)
starts_with_a = name_filter.filter(persons_collection.persons)
# 输出过滤结果
print("Adults:")
for person in adults:
print(f"{person.name} ({person.age} years old)")
print("\nNames starting with 'A':")
for person in starts_with_a:
print(f"{person.name} ({person.age} years old)")
在上述示例中,Filter 是过滤器接口,AdultFilter 和 NameFilter 是具体过滤器类。Person 是表示人的类,而 PersonsCollection 是包含人的集合的具体目标类。客户端代码可以使用具体过滤器对象来过滤人的集合,并输出过滤结果。
过滤器模式的优点在于它提供了一种灵活的方式来组合多个过滤条件,使得客户端代码可以根据需要选择不同的过滤条件。这样可以避免在目标类中直接实现所有可能的过滤逻辑,从而使系统更加可扩展和可维护。
转载请注明出处:http://www.zyzy.cn/article/detail/11845/设计模式