lass Person:
name: str
gender: str
maritalStatus: str
def __init__(self, name: str, gender: str, maritalStatus: str):
self.name = name
self.gender = gender
self.maritalStatus = maritalStatus
def getName(self):
return self.name
def getGender(self):
return self.gender
def getMaritalStatus(self):
return self.maritalStatus
class Criteria:
def meetCriteria(self, persons: List[Person]):
raise NotImplemented
class CriteriaMale(Criteria):
def meetCriteria(self, persons: List[Person]):
malePersons: List[Person] = []
for person in persons:
if person.getGender() == 'Male':
malePersons.append(person)
return malePersons
class CriteriaFemale(Criteria):
def meetCriteria(self, persons: List[Person]):
malePersons: List[Person] = []
for person in persons:
if person.getGender() == 'Female':
malePersons.append(person)
return malePersons
class CriteriaSingle(Criteria):
def meetCriteria(self, persons: List[Person]):
malePersons: List[Person] = []
for person in persons:
if person.getMaritalStatus() == 'Single':
malePersons.append(person)
return malePersons
class AndCriteria(Criteria):
criteria: Criteria
otherCriteria: Criteria
def __init__(self, criteria: Criteria, otherCriteria: Criteria):
self.criteria = criteria
self.otherCriteria = otherCriteria
def meetCriteria(self, persons: List[Person]):
firstCriteriaPersons: List[Person] = self.criteria.meetCriteria(persons)
return self.otherCriteria.meetCriteria(firstCriteriaPersons)
class OrCriteria(Criteria):
criteria: Criteria
otherCriteria: Criteria
def __init__(self, criteria: Criteria, otherCriteria: Criteria):
self.criteria = criteria
self.otherCriteria = otherCriteria
def meetCriteria(self, persons: List[Person]):
firstCriteriaPersons: List[Person] = self.criteria.meetCriteria(persons)
otherCriteriaItems: List[Person] = self.otherCriteria.meetCriteria(persons)
for person in otherCriteriaItems:
if person not in firstCriteriaPersons:
firstCriteriaPersons.append(person)
return firstCriteriaPersons
class CriteriaPatternDemo:
def __init__(self):
persons: List[Person] = []
persons.append(Person("Robert", "Male", "Single"))
persons.append(Person("John", "Male", "Married"))
persons.append(Person("Laura", "Female", "Married"))
persons.append(Person("Diana", "Female", "Single"))
persons.append(Person("Mike", "Male", "Single"))
persons.append(Person("Bobby", "Male", "Single"))
male: Criteria = CriteriaMale()
female: Criteria = CriteriaFemale()
single: Criteria = CriteriaSingle()
singleMale: Criteria = AndCriteria(single, male)
singleOrFemale: Criteria = OrCriteria(single, female)
print('Males')
self.printPersons(male.meetCriteria(persons))
print('Females')
self.printPersons(female.meetCriteria(persons))
print('Single Males')
self.printPersons(singleMale.meetCriteria(persons))
print('Single Or Females')
self.printPersons(singleOrFemale.meetCriteria(persons))
def printPersons(self, persons: List[Person]):
for person in persons:
print(
f'Person : [ Name : {person.getName()} ,Gender :{person.getGender()}, Marital Status :{person.getMaritalStatus()}]')
if __name__ == '__main__':
CriteriaPatternDemo()
Males
Person : [ Name : Robert ,Gender :Male, Marital Status :Single]
Person : [ Name : John ,Gender :Male, Marital Status :Married]
Person : [ Name : Mike ,Gender :Male, Marital Status :Single]
Person : [ Name : Bobby ,Gender :Male, Marital Status :Single]
Females
Person : [ Name : Laura ,Gender :Female, Marital Status :Married]
Person : [ Name : Diana ,Gender :Female, Marital Status :Single]
Single Males
Person : [ Name : Robert ,Gender :Male, Marital Status :Single]
Person : [ Name : Mike ,Gender :Male, Marital Status :Single]
Person : [ Name : Bobby ,Gender :Male, Marital Status :Single]
Single Or Females
Person : [ Name : Robert ,Gender :Male, Marital Status :Single]
Person : [ Name : Diana ,Gender :Female, Marital Status :Single]
Person : [ Name : Mike ,Gender :Male, Marital Status :Single]
Person : [ Name : Bobby ,Gender :Male, Marital Status :Single]
Person : [ Name : Laura ,Gender :Female, Marital Status :Married]