Filter pattern or Criteria pattern
- 객체의 set에서 특정 criteria를 이용하여 decoupling 하는 역할을 하는 pattern
- Criteria interface와 해당 interface의 implementation을 사용한다.
- structual pattern의 하나.
- multiple criteria를 조합하여 하나의 single criteria를 만들어 낼 수 있다. -> combination criteria.
Person.java
public class Person {
private String name;
private String gender;
private String maritalStatus;
public Person(String name, String gender, String maritalStatus){
this.name = name;
this.gender = gender;
this.maritalStatus = maritalStatus;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public String getMaritalStatus() {
return maritalStatus;
}
}
Criteria.java
public interface Criteria {
public List meetCriteria(List persons);
}
concrete implementation of Criteria
public class CriteriaMale implements Criteria {
@Override
public List meetCriteria(List persons) {
List malePersons = new ArrayList();
for (Person p : persons ){
if (p.getGender().equalsIgnoreCase("male"))
malePersons.add(p);
}
return malePersons;
}
}
public class CriteriaFemale implements Criteria {
@Override
public List meetCriteria(List persons) {
List femalePersons = new ArrayList();
for (Person p : persons ){
if (p.getGender().equalsIgnoreCase("Female"))
femalePersons.add(p);
}
return femalePersons;
}
}
public class CriteriaSingle implements Criteria {
@Override
public List meetCriteria(List persons) {
List singlePersons = new ArrayList<>();
for (Person p : persons){
if(p.getMartialStatus().equalsIgnoreCase("single"))
singlePersons.add(p);
}
return singlePersons;
}
}
public class AndCriteria implements Criteria {
private Criteria criteria;
private Criteria otherCriteria;
public AndCriteria(Criteria criteria, Criteria otherCriteria){
this.criteria=criteria;
this.otherCriteria=otherCriteria;
}
@Override
public List meetCriteria(List persons) {
List firstCriteriaPersons = criteria.meetCriteria(persons);
return otherCriteria.meetCriteria(firstCriteriaPersons);
}
}
public class OrCriteria implements Criteria {
private Criteria criteria;
private Criteria otherCriteria;
public OrCriteria(Criteria criteria, Criteria otherCriteria){
this.criteria=criteria;
this.otherCriteria=otherCriteria;
}
@Override
public List meetCriteria(List persons) {
List firstCriteriaPersons = criteria.meetCriteria(persons);
List otherCriteriaPersons = otherCriteria.meetCriteria(persons);
for (Person p : otherCriteriaPersons){
if( !firstCriteriaPersons.contains(p))
firstCriteriaPersons.add(p);
}
return firstCriteriaPersons;
}
}
Main 사용 부분 : OrCriteria 및 AndCriteria를 이용하여 새로운 Criteria를 조합하는 것에 주목한다.
List persons = new ArrayList<>();
persons.add(new Person("Robert","Male", "Single"));
persons.add(new Person("John", "Male", "Married"));
persons.add(new Person("Laura", "Female", "Married"));
persons.add(new Person("Diana", "Female", "Single"));
persons.add(new Person("Mike", "Male", "Single"));
persons.add(new Person("Bobby", "Male", "Single"));
Criteria male = new CriteriaMale();
Criteria female = new CriteriaFemale();
Criteria single = new CriteriaSingle();
Criteria singleOrFemale = new OrCriteria(female,single);
Criteria maleSigle = new AndCriteria(male,single);
Log.d(TAG, "male list");
printPeople(male.meetCriteria(persons));
Log.d(TAG, "female list");
printPeople(female.meetCriteria(persons));
Log.d(TAG, "single list");
printPeople(single.meetCriteria(persons));
Log.d(TAG, "single or female list");
printPeople(singleOrFemale.meetCriteria(persons));
Log.d(TAG, "single and male list");
printPeople(maleSigle.meetCriteria(persons));
결과 :
07-19 16:21:40.018 15971 15971 D hello : male list
07-19 16:21:40.019 15971 15971 D hello : name : Robert gender:Male martialStatus :Single
07-19 16:21:40.019 15971 15971 D hello : name : John gender:Male martialStatus :Married
07-19 16:21:40.019 15971 15971 D hello : name : Mike gender:Male martialStatus :Single
07-19 16:21:40.019 15971 15971 D hello : name : Bobby gender:Male martialStatus :Single
07-19 16:21:40.019 15971 15971 D hello : female list
07-19 16:21:40.019 15971 15971 D hello : name : Laura gender:Female martialStatus :Married
07-19 16:21:40.019 15971 15971 D hello : name : Diana gender:Female martialStatus :Single
07-19 16:21:40.019 15971 15971 D hello : single list
07-19 16:21:40.019 15971 15971 D hello : name : Robert gender:Male martialStatus :Single
07-19 16:21:40.019 15971 15971 D hello : name : Diana gender:Female martialStatus :Single
07-19 16:21:40.019 15971 15971 D hello : name : Mike gender:Male martialStatus :Single
07-19 16:21:40.019 15971 15971 D hello : name : Bobby gender:Male martialStatus :Single
07-19 16:21:40.019 15971 15971 D hello : single or female list
07-19 16:21:40.019 15971 15971 D hello : name : Laura gender:Female martialStatus :Married
07-19 16:21:40.019 15971 15971 D hello : name : Diana gender:Female martialStatus :Single
07-19 16:21:40.020 15971 15971 D hello : name : Robert gender:Male martialStatus :Single
07-19 16:21:40.020 15971 15971 D hello : name : Mike gender:Male martialStatus :Single
07-19 16:21:40.020 15971 15971 D hello : name : Bobby gender:Male martialStatus :Single
07-19 16:21:40.020 15971 15971 D hello : single and male list
07-19 16:21:40.020 15971 15971 D hello : name : Robert gender:Male martialStatus :Single
07-19 16:21:40.020 15971 15971 D hello : name : Mike gender:Male martialStatus :Single
07-19 16:21:40.020 15971 15971 D hello : name : Bobby gender:Male martialStatus :Single
출처 :