2017-11-16 3 views
0

Ich habe die Anforderung, eine Sammlung von Objekten (z. B. Reservierungen) basierend auf einem oder mehreren der folgenden Suchkriterien zu durchsuchen. Ich plane, das Filtermuster zu verwenden, um dies zu implementieren.Verwenden von Filterentwurfsmuster zum dynamischen Erstellen eines Filterkriteriums

Suchoptionen: Vorname, Nachname, Telefon, E-Mail

Voraussetzung ist, - wenn der Benutzer nur den fistname Filter gibt, verwenden Sie nur Vornamen zu filtern. Wenn der Benutzer sowohl den Vornamen als auch das Telefon angibt, verwenden Sie beide (und Kriterien) zum Filtern. Wenn alle 4 Optionen angegeben sind, verwenden Sie alle 4.

Ich habe die Klassen für alle 4 Suchkriterien erstellt. Ich habe Zweifel, wie ich es benutzen soll. Beispiel:

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? 
    } 

Wie ist die richtige Methode für die Bearbeitung dieses Suchszenarios?

Antwort

1

Sie sollten die Lösung Ihrer Problemstellung mit Intercepting Filter Pattern entwerfen.

Unten ist der Code mit Intercepting Filtermuster:

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; 
    } 

} 

Treiber-Code:

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

ich sehe, rechts. Danke, das habe ich vermisst. – devC

Verwandte Themen