2017-11-16 15 views
0

다음 검색 기준 중 하나 이상을 기반으로 개체 컬렉션 (예 : 예약)을 검색해야합니다. 나는 이것을 구현하기 위해 필터 패턴을 사용할 계획이다.필터 기준을 동적으로 생성하기위한 필터 디자인 패턴 사용

검색 옵션 : 이름, 성, 전화, 이메일

요구 사항은 - 사용자 만 fistname 필터를 지정하는 경우는, 필터 만 FIRSTNAME을 사용합니다. 사용자가 이름과 전화를 모두 지정하면 두 가지 (및 기준)를 모두 사용하여 필터링합니다. 4 개의 옵션을 모두 지정하면 모두 4를 사용하십시오.

4 가지 검색 기준 모두에 대해 클래스를 만들었습니다. 나는 그것을 사용하는 방법에 관해서 의심 스럽다. 예 :

ISearchCriteria searchCriteria; 

    if(firstName != null) 
    { 
      searchCriteria= new FirstNameSearchCriteria(CurrentClient); 
    } 

    if(lastName!= null) 
    { 
      //what do I do here? I have an AndCriteria class which accepts two ISearchCriteria objects. How do I use it? 
    } 

이 검색 시나리오를 처리하는 올바른 방법은 무엇입니까?

답변

1

차단 패턴을 사용하여 문제문의 해를 설계해야합니다. 오른쪽

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Person> persons = new List<Person>(); 

     persons.Add(new Person { FirstName = "Robert", LastName = "kerry", Phone = "1234", Email = "[email protected]"}); 
     persons.Add(new Person { FirstName = "Robert", LastName = "Sam", Phone = "1234", Email = "[email protected]" }); 
     persons.Add(new Person { FirstName = "Jon", LastName = "Kam", Phone = "1234", Email = "[email protected]" }); 

     Console.WriteLine("---Search by First and Last Name----"); 
     ICriteria firstName = new CriteriaFirstName("Robert"); 
     ICriteria lastName = new CriteriaLastName("Kerry"); 
     ICriteria fullName = new AndCriteria(firstName, lastName); 
     var searchedData = fullName.MeetCriteria(persons); 

     //Search by First and last name (And criteria) 
     foreach (var person in searchedData) 
     { 
      Console.WriteLine(person.FirstName); 
      Console.WriteLine(person.LastName); 
      Console.WriteLine(person.Phone); 
     } 

     //Search by first name and email. (And Criteria) 
     firstName = new CriteriaFirstName("Robert"); 
     var email = new CriteriaEmail("[email protected]"); 
     fullName = new AndCriteria(firstName, email); 
     searchedData = fullName.MeetCriteria(persons); 
     foreach (var person in searchedData) 
     { 
      Console.WriteLine(person.FirstName); 
      Console.WriteLine(person.LastName); 
      Console.WriteLine(person.Phone); 
     } 

     Console.WriteLine("---Search by First Name Only----"); 
     firstName = new CriteriaFirstName("Robert"); 
     searchedData = firstName.MeetCriteria(persons); 
     foreach (var person in searchedData) 
     { 
      Console.WriteLine(person.FirstName); 
      Console.WriteLine(person.LastName); 
      Console.WriteLine(person.Phone); 
     } 

     Console.WriteLine("---Search by First Name or email ----"); 
     //Search by first name . (or Criteria) 
     firstName = new CriteriaFirstName("Robert"); 
     email = new CriteriaEmail("[email protected]"); 
     fullName = new OrCriteria(firstName, email); 
     searchedData = fullName.MeetCriteria(persons); 
     foreach (var person in searchedData) 
     { 
      Console.WriteLine(person.FirstName); 
      Console.WriteLine(person.LastName); 
      Console.WriteLine(person.Phone); 
     } 

     Console.ReadKey(); 
    } 
} 
+1

내가 볼 :

public class Person { public String FirstName { get; set; } public String LastName { get; set; } public String Phone { get; set; } public String Email { get; set; } } public interface ICriteria { List<Person> MeetCriteria(List<Person> persons); } public class CriteriaFirstName : ICriteria { private string searchCriteria; public CriteriaFirstName(string searchCriteria) { this.searchCriteria = searchCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> personsData = new List<Person>(); foreach (var item in persons) { if (item.FirstName.ToUpper().Equals(searchCriteria.ToUpper())) { personsData.Add(item); } } return personsData; } public class CriteriaLastName : ICriteria { private string searchCriteria; public CriteriaLastName(string searchCriteria) { this.searchCriteria = searchCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> personsData = new List<Person>(); foreach (var item in persons) { if (item.LastName.ToUpper().Equals(searchCriteria.ToUpper())) { personsData.Add(item); } } return personsData; } } public class CriteriaLastPhone : ICriteria { private string searchCriteria; CriteriaLastPhone(string searchCriteria) { this.searchCriteria = searchCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> personsData = new List<Person>(); foreach (var item in persons) { if (item.Phone.ToUpper().Equals(searchCriteria.ToUpper())) { personsData.Add(item); } } return personsData; } } public class CriteriaEmail : ICriteria { private string searchCriteria; public CriteriaEmail(string searchCriteria) { this.searchCriteria = searchCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> personsData = new List<Person>(); foreach (var item in persons) { if (item.Email.ToUpper().Equals(searchCriteria.ToUpper())) { personsData.Add(item); } } return personsData; } } public class AndCriteria : ICriteria { private ICriteria criteria; private ICriteria otherCriteria; public AndCriteria(ICriteria criteria, ICriteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> firstCriteriaPersons = criteria.MeetCriteria(persons); return otherCriteria.MeetCriteria(firstCriteriaPersons); } } public class OrCriteria : ICriteria { private ICriteria criteria; private ICriteria otherCriteria; public OrCriteria(ICriteria criteria, ICriteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } public List<Person> MeetCriteria(List<Person> persons) { List<Person> firstCriteriaItems = criteria.MeetCriteria(persons); List<Person> otherCriteriaItems = otherCriteria.MeetCriteria(persons); foreach (var otherItems in otherCriteriaItems) { if (!firstCriteriaItems.Contains(otherItems)) { firstCriteriaItems.Add(otherItems); } } return firstCriteriaItems; } } 

드라이버 코드 :

다음은 필터 패턴을 가로 채기와 함께 사용하는 코드입니다. 고마워, 이건 내가 놓친거야. – devC