使用不同的标准来过滤一组对象,通过逻辑运算的方式把他们解耦

Demo

  1. """
  2. 过滤器模式
  3. """
  4. class Person:
  5. def __init__(self, name, gender, marital_status):
  6. self.name = name
  7. self.gender = gender
  8. self.marital_status = marital_status
  9. def __str__(self):
  10. return '我是str'
  11. def __repr__(self):
  12. return f"name:{self.name}, gender: {self.gender},martial_status:{self.marital_status}"
  13. class Criteria:
  14. def meet_criteria(self, persons: [Person]):
  15. raise NotImplementedError
  16. class CriteriaMale(Criteria):
  17. def meet_criteria(self, persons: [Person]):
  18. return set(filter(lambda person: person.gender == 'Male', persons))
  19. class CriteriaFemale(Criteria):
  20. def meet_criteria(self, persons: [Person]):
  21. return set(filter(lambda person: person.gender == 'Female', persons))
  22. class CriteriaSingle(Criteria):
  23. def meet_criteria(self, persons: [Person]):
  24. return set(filter(lambda person: person.marital_status == 'Single', persons))
  25. class AndCriteria(Criteria):
  26. def __init__(self, criteria: Criteria, other_criteria: Criteria):
  27. self.criteria = criteria
  28. self.other_criteria = other_criteria
  29. def meet_criteria(self, persons: [Person]):
  30. return set(self.criteria.meet_criteria(persons)) & set(self.other_criteria.meet_criteria(persons))
  31. class OrCriteria(Criteria):
  32. def __init__(self, criteria: Criteria, other_criteria: Criteria):
  33. self.criteria = criteria
  34. self.other_criteria = other_criteria
  35. def meet_criteria(self, persons: [Person]):
  36. return set(self.criteria.meet_criteria(persons)) | set(self.other_criteria.meet_criteria(persons))
  37. if __name__ == '__main__':
  38. persons = [
  39. Person("Robert", "Male", "Single"),
  40. Person("John", "Male", "Married"),
  41. Person("Laura", "Female", "Married"),
  42. Person("Diana", "Female", "Single"),
  43. Person("Mike", "Male", "Single"),
  44. Person("Bobby", "Male", "Single"),
  45. ]
  46. male = CriteriaMale()
  47. female = CriteriaFemale()
  48. single = CriteriaSingle()
  49. single_male = AndCriteria(male, single)
  50. single_or_female = OrCriteria(single, female)
  51. print(f"males:")
  52. print(male.meet_criteria(persons))
  53. print(f"female:")
  54. print(female.meet_criteria(persons))
  55. print(f"single:")
  56. print(single.meet_criteria(persons))
  57. print("single males:")
  58. print(single_male.meet_criteria(persons))
  59. print("single or females:")
  60. print(single_or_female.meet_criteria(persons))