首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于创建同一类型的多个对象的设计模式

用于创建同一类型的多个对象的设计模式
EN

Stack Overflow用户
提问于 2015-01-26 13:37:44
回答 1查看 2K关注 0票数 4

我正在编写一个搜索parser.There是一个输入搜索查询(字符串),它需要转换为单独的条件对象。

例如,/perons/?q=age>50&name:mike

此查询将转换为两个条件对象。2.LikeCondition(字符串字段,字符串值)

我有14个这样的condition对象,它们实现了Condition接口。

在运行时,我从查询中解析出字符串条件(如"age>50"),我需要设计一种算法,将此条件高效地转换为适当的对象(如GreaterThanCondition)。

这是我正在思考的一个算法:创建一个ConditionFactory。如果工厂中定义的正则表达式(例如,GreaterThanConditionFactory的正则表达式可以是a-zA-Z0-9+>+0-9+ ),则此ConditionFactory将接受此字符串(“age>50”),并按特定顺序迭代现有的14个工厂(每个条件对应一个工厂)。基于正则表达式匹配,GreaterThanConditionFactory可以从条件中识别字段(年龄)和值(50),并创建GreaterThanConditionObject。

使用这种方法,我需要创建15个工厂和14个条件对象。我不确定创建这么多工厂是否是一个好的解决方案。请提个建议。

EN

回答 1

Stack Overflow用户

发布于 2015-08-11 16:36:01

您可以使用一个利用CharacterIterator的非常简单的recursive descent parser和一个builder。这将更具可读性,它将比检查14个正则表达式更快,并且它将支持多个查询条件。

代码语言:javascript
复制
public class QueryParser {
  CharacterIterator iterator;
  QueryBuilder queryBuilder;
  QueryConditionBuilder queryConditionBuilder;

  public Query parse(String text) {
    iterator = new StringCharacterIterator(text);
    queryBuilder = new QueryBuilder();
    while (hasNext()) {
      queryConditionBuilder = new QueryConditionBuilder();
      conditionSeparator();
      queryCondition();
      queryBuilder.withCondition(queryConditionBuilder.getQueryCondition()); 
    }
    return queryBuilder.getQuery();
  }

  public void conditionSeparator() {
     // if the next character is an &, then advance the iterator
  }

  public void parseQueryCondition() {
    key();
    operator();
    value();
  }

  public void parseKey() {
    // ... keep reading until the next character is not alphabetic
    queryConditionBuilder.withKey(key);
  }

  public void parseOperator() {
    // ... could be as simple as a one character check
    queryConditionBuilder.withOperator(operator);
  }

  public void parseValue() {
    // ... probably a number, so just read until the next character is not a digit or you reach the end of a string
    queryConditionBuilder.withValue(value);
  }

  public Character peek() {
     // delegate to character iterator
  }

  public Character next() {
     // delegate to character iterator
  }

  public boolean hasNext() {
     // delegate to character iterator
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28145240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档