pattern2018. 7. 19. 16:35

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
출처 :


'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
Posted by easy16