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 ListmeetCriteria(List persons); }
concrete implementation of Criteria
public class CriteriaMale implements Criteria { @Override public ListmeetCriteria(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를 조합하는 것에 주목한다.
Listpersons = 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
출처 :
'pattern' 카테고리의 다른 글
uml 기호 정리 (0) | 2018.07.20 |
---|---|
Composite pattern (0) | 2018.07.19 |
Bridge pattern (0) | 2018.07.19 |
Adapter pattern (0) | 2018.07.19 |
Prototype pattern (0) | 2018.07.18 |