[구조 패턴] Filter/Criteria pattern (필터패턴)
(원문 위치 : http://www.tutorialspoint.com/design_pattern/filter_pattern.htm )
필터 패턴 또는 기준 패턴은 개발자가 여러 기준을 사용하여 개체 세트를 필터링하고 논리적 작업을 통해 분리 된 방식으로 연결하는 데 사용할 수있는 디자인 패턴입니다. 이 패턴은 단일 기준을 얻기 위해 여러 기준을 결합하므로이 유형의 디자인 패턴은 구조 패턴에 속합니다.
Implementation
우리는 Person 객체, Criteria 인터페이스 그리고 이 인터페이스를 구현하는 구체적인 클래스를 만들어 Person 객체 목록을 필터링 할 것입니다. CriteriaPatternDemo, 데모 클래스는 Criteria 객체를 사용하여 다양한 기준과 해당 조합을 기반으로 Person 객체 목록을 필터링합니다.
Step 1
기준이 적용되기 위한 클래스를 생성한다.
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; } }
Step 2
기준을 위한 인터페이스를 생성한다.
Criteria.java
import java.util.List; public interface Criteria { public List<Person> meetCriteria(List<Person> persons); }
Step 3
Criteria인터페이스를 구현하는 구체적인 클래스를 생성한다.
CriteriaMale.java
import java.util.ArrayList; import java.util.List; public class CriteriaMale implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> malePersons = new ArrayList<Person>(); for (Person person : persons) { if(person.getGender().equalsIgnoreCase("MALE")){ malePersons.add(person); } } return malePersons; } }
CriteriaFemale.java
import java.util.ArrayList; import java.util.List; public class CriteriaFemale implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> femalePersons = new ArrayList<Person>(); for (Person person : persons) { if(person.getGender().equalsIgnoreCase("FEMALE")){ femalePersons.add(person); } } return femalePersons; } }
CriteriaSingle.java
import java.util.ArrayList; import java.util.List; public class CriteriaSingle implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> singlePersons = new ArrayList<Person>(); for (Person person : persons) { if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){ singlePersons.add(person); } } return singlePersons; } }
AndCriteria.java
import java.util.List; 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<Person> meetCriteria(List<Person> persons) { List<Person> firstCriteriaPersons = criteria.meetCriteria(persons); return otherCriteria.meetCriteria(firstCriteriaPersons); } }
OrCriteria.java
import java.util.List; 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<Person> meetCriteria(List<Person> persons) { List<Person> firstCriteriaItems = criteria.meetCriteria(persons); List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons); for (Person person : otherCriteriaItems) { if(!firstCriteriaItems.contains(person)){ firstCriteriaItems.add(person); } } return firstCriteriaItems; } }
Step4
다른 기준과 person을 필터하기 위한 기준의 조합을 사용한다.
CriteriaPatternDemo.java
public class CriteriaPatternDemo { public static void main(String[] args) { List<Person> persons = new ArrayList<Person>(); 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 singleMale = new AndCriteria(single, male); Criteria singleOrFemale = new OrCriteria(single, female); System.out.println("Males: "); printPersons(male.meetCriteria(persons)); System.out.println("\nFemales: "); printPersons(female.meetCriteria(persons)); System.out.println("\nSingle Males: "); printPersons(singleMale.meetCriteria(persons)); System.out.println("\nSingle Or Females: "); printPersons(singleOrFemale.meetCriteria(persons)); } public static void printPersons(List<Person> persons){ for (Person person : persons) { System.out.println("Person : [ Name : " + person.getName() + ", Gender : " + person.getGender() + ", Marital Status : " + person.getMaritalStatus() + " ]"); } } }
Step 5
결과를 확인한다.
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 ]
'Development > Java' 카테고리의 다른 글
코드의 법칙 (0) | 2017.04.24 |
---|---|
[행위 패턴] Null Object pattern (널 오브젝트 패턴) (0) | 2017.04.13 |
[행위 패턴] Visitor pattern (비지터 패턴) (0) | 2017.03.26 |
[생성 패턴] Prototype pattern (프로토타입 패턴) (0) | 2017.03.26 |
[행위 패턴] Memento pattern (메멘토 패턴) (0) | 2017.03.26 |