본문 바로가기

프로그래밍/자바 디자인 패턴

자바 디자인 패턴 튜토리얼 - 구조 설계 패턴 - 필터 / 기준 패턴

반응형

필터 패턴은 다른 기준을 사용하여 객체를 필터링합니다.

기준은 논리 연산을 통해 함께 연결될 수 있습니다.

필터 패턴은 구조적 패턴입니다.

예제



import java.util.List;import java.util.ArrayList;class Employee {  private String name;  private String gender;  private String retireStatus;  public Employee(String name, String gender, String r) {    this.name = name;    this.gender = gender;    this.retireStatus = r;  }  public String getName() {    return name;  }  public String getGender() {    return gender;  }  public String getRetireStatus() {    return retireStatus;  }  @Override  public String toString() {    return "Employee [name=" + name + ", gender=" + gender        + ", retireStatus=" + retireStatus + "]";  }}interface Criteria {  public List meetCriteria(List persons);}class CriteriaMale implements Criteria {  @Override  public List meetCriteria(List persons) {    List malePersons = new ArrayList();    for (Employee person : persons) {      if (person.getGender().equalsIgnoreCase("MALE")) {        malePersons.add(person);      }    }    return malePersons;  }}class CriteriaFemale implements Criteria {  @Override  public List meetCriteria(List persons) {    List femalePersons = new ArrayList();    for (Employee person : persons) {      if (person.getGender().equalsIgnoreCase("FEMALE")) {        femalePersons.add(person);      }    }    return femalePersons;  }}class CriteriaRetire implements Criteria {  @Override  public List meetCriteria(List persons) {    List singlePersons = new ArrayList();    for (Employee person : persons) {      if (person.getRetireStatus().equalsIgnoreCase("YES")) {        singlePersons.add(person);      }    }    return singlePersons;  }}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);  }}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 firstCriteriaItems = criteria.meetCriteria(persons);    List otherCriteriaItems = otherCriteria.meetCriteria(persons);    for (Employee person : otherCriteriaItems) {      if (!firstCriteriaItems.contains(person)) {        firstCriteriaItems.add(person);      }    }    return firstCriteriaItems;  }}public class Main {  public static void main(String[] args) {    List persons = new ArrayList();    persons.add(new Employee("Tom", "Male", "YES"));    persons.add(new Employee("Jack", "Male", "NO"));    persons.add(new Employee("Jane", "Female", "NO"));    persons.add(new Employee("Diana", "Female", "YES"));    persons.add(new Employee("Mike", "Male", "NO"));    persons.add(new Employee("Bob", "Male", "YES"));    Criteria male = new CriteriaMale();    Criteria female = new CriteriaFemale();    Criteria retire = new CriteriaRetire();    Criteria retireMale = new AndCriteria(retire, male);    Criteria retireOrFemale = new OrCriteria(retire, female);    System.out.println("Males: ");    printPersons(male.meetCriteria(persons));    System.out.println("Females: ");    printPersons(female.meetCriteria(persons));    System.out.println("Retire Males: ");    printPersons(retireMale.meetCriteria(persons));    System.out.println("Retire Or Females: ");    printPersons(retireOrFemale.meetCriteria(persons));  }  public static void printPersons(List persons) {    for (Employee person : persons) {      System.out.println(person);    }  }}

위의 코드는 다음 결과를 생성합니다.

Males:Employee [name=Tom, gender=Male, retireStatus=YES]Employee [name=Jack, gender=Male, retireStatus=NO]Employee [name=Mike, gender=Male, retireStatus=NO]Employee [name=Bob, gender=Male, retireStatus=YES]Females:Employee [name=Jane, gender=FeMale, retireStatus=NO]Employee [name=Diana, gender=FeMale, retireStatus=YES]Retire Males:Employee [name=Tom, gender=Male, retireStatus=YES]


반응형