2011-07-05 126 views
1

在我的代码中,我有一个List<Person>。属性在此列表中的对象可以包括沿着线的东西:创建方法过滤器

  • ID

在我的应用程序的一部分,我将被允许用户通过使用这三个值的任何组合来搜索特定人员。目前,我有一个switch语句,简单地检查填充了哪些字段,并调用为该组合值指定的方法。

即:

switch typeOfSearch  
if 0, lookById()  
if 1, lookByIdAndName() 
if 2, lookByFirstName() 

等。实际上有7种不同的类型。

这使得我有一种方法为每个语句。这是做这件事的'好'方法吗?有没有一种方法可以使用参数或某种“过滤器”?它可能没有什么区别,但我用Java编写了这个代码。

回答

3

你可以做一些更优雅的地图和界面。试试这个例如,

interface LookUp{ 
    lookUpBy(HttpRequest req); 
} 

Map<Integer, LookUp> map = new HashMap<Integer, LookUp>(); 

map.put(0, new LookUpById()); 
map.put(1, new LookUpByIdAndName()); 

...

控制器那么你可以做

int type = Integer.parseInt(request.getParameter(type)); 
Person person = map.get(type).lookUpBy(request); 

这种方式可以快速查找的方法与地图。当然,你也可以使用一个长开关,但我觉得这更易于管理。

0

如果好意思是“语言对我来说”,否。

如果好意味着'可读',我会在Person中定义一个方法match(),如果该对象符合您的搜索条件,则返回true。此外,可能是创建方法标准的一种好方法,您可以在其中封装搜索条件(您要查找哪些字段以及哪个值)并将其传递至匹配条件(标准条件)。

0

这种做法很快就变得难以管理,因为组合的数量很快就会变得巨大。 创建拥有所有可能的查询参数的PersonFilter类,并访问列表中的每个人:

private class PersonFilter { 
    private String id; 
    private String firstName; 
    private String lastName; 

    // constructor omitted 

    public boolean accept(Person p) { 
     if (this.id != null && !this.id.equals(p.getId()) { 
      return false; 
     } 
     if (this.firstName != null && !this.firstName.equals(p.getFirstName()) { 
      return false; 
     } 
     if (this.lastName != null && !this.lastName.equals(p.getLastName()) { 
      return false; 
     } 

     return true; 
    } 
} 

过滤现在由

public List<Person> filter(List<Person> list, PersonFilter filter) { 
    List<Person> result = new ArrayList<Person>(); 
    for (Person p : list) { 
     if (filter.accept(p) { 
      result.add(p); 
     } 
    } 
    return result; 
} 
0

实现在某些时候,你应该看一看的东西像Lucene这将为您提供此类搜索的最佳可扩展性,可管理性和性能。不知道你处理的数据量只有只有建议这是一个更长期的解决方案与更大的对象搜索。这是一个了不起的工具!