一、Java IO中的装饰器模式:
良好的设计模式可以更好的扩充,“开闭原则”是指对新功能开放,对原有代码封闭。我理解为纵向扩展,在尽量不改变原代码的前提下进行扩展新功能,典型的装饰器例子有java IO包中的大家耳熟能详的代码:
BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(new File("test.txt"))));
我们看上面的一句代码,
FileInputStream对new File("text.txt")进行了装饰!
InputStreamReader对FileInputStream进行了装饰!
BufferedReader对InputStreamReader进行了装饰!
我们假设现在对一个文件全部转换成 小写 字母,那么我们需要构购一个,那么上述的代码可
以改成:
BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(new FileLowCaseStream(new File("test.txt")))));
二、我们的应用:
大家都用过51Job找过工作吧,假设现在找工作的Server业务层里有这几个搜索
1)前缀搜索:如有公司名为“腾迅网络”,那么,应该支持用户输入“腾迅”。(PrefixQuery)
2)准确搜索:搜索关键字为“java”(TermQuery)
3)范围搜索:搜索“某天到某到”,(RangeQuery)
4)模糊搜索:通过公司地址,“深圳”,也能搜索到“腾迅网络”(FuzzyQuery)
三、代码如下:
1)构建一个BaseQuery,主要提供类型一致,它是一个抽象类。
public abstract class BaseQuery {
public abstract BooleanQuery getQuery();
}
2)构建SearchQuery,它是我们上面提到的四种搜索的父类。
public abstract class SearchQuery extends BaseQuery {
protected BaseQuery baseQuery;
public abstract Query setQuery();
@Override
public BooleanQuery getQuery() {
BooleanQuery booleanQuery;
if (null == baseQuery)
booleanQuery = new BooleanQuery();
else
booleanQuery = baseQuery.getQuery() == null ? new BooleanQuery()
: baseQuery.getQuery();
Query query = setQuery();
booleanQuery.add(query, Occur.MUST);
return booleanQuery;
}
}
3)分别构建上面四种搜索:
public class FuzzyTemplateQuery extends SearchQuery {
protected String queryValue;
protected String attribute;
@Override
public Query setQuery() {
return new FuzzyQuery(new Term(attribute,queryValue));
}
}
上面代码,attribute是存进索引的键,queryValue是客户端输入的搜索的值。
同样的,构建其它三另的搜索只需重载一下setQuery即可,下面一并给出代码:
//前缀搜索,PrefixQuery
@Override
public Query setQuery() {
return new PrefixQuery(new Term(attribute,queryValue));
}
//准确搜索 TermQuery
@Override
public TermQuery setQuery() {
return new TermQuery(new Term(attribute,queryValue));
}
//范围搜索,RangeQuery,注意范围搜索有起始值和结束值
@Override
public Query setQuery() {
Term start = new Term(attribute,startValue);
Term end = new Term(attribute,endValue);
Query rangeQuery = new RangeQuery(start,end,bound);
return rangeQuery;
}
//针对RangeQuery我们还可以加上边界的设定
public BaseQuery setBound(boolean bound) {
this.bound = bound;
return this;
}
四、通过四种类型构造查询,如查找公司名称,它继承自PrefixTemplateQuery
public class CorporationQuery extends prefixQuery {
public CompanyQuery(String queryValue, BaseQuery baseQuery) {
this.attribute = "companyField";//设置索引中的key
this.queryValue = queryValue;
this.baseQuery = baseQuery;
}
}
其实做到这一步,就已经很容易了,只需要一个构造函数完成值的设置就行了。其它的就不举例了。分别继承再设值就好了。
五、写客户端的代码。
BaseQuery base = new CorporationQuery("腾讯",null);
那如果同时要查询腾讯公司的java职位呢?
BaseQuery base = new CorporationQuery("腾讯",null);
base = new JobQuery("java",base);
我们注意到,先构建一个query,搜索“腾讯”公司的,然后再构建JobQuery来装饰CorporationQuery。
至此我们完成了装饰器来动态增加搜索,尊循了开闭原则。
分享到:
相关推荐
- **迭代器模式**:在遍历索引时,如TermEnum和DocsAndPositionsEnum,使用了迭代器模式来遍历文档和位置信息。 - **工厂模式**:用于创建Analyzer、IndexWriter和Searcher等对象,简化了不同配置的实例化过程。 ...
- **装饰器模式**:Analyzer和Filter类可以组合使用,形成一个装饰器链,增加新的处理逻辑。 4. **高级特性**: - **评分系统(Scoring)**:Lucene通过TF-IDF算法计算相关度,决定搜索结果的排序。 - **过滤器...
### IKAnalyzer中文分词器V3.1.1使用手册 #### 1. IKAnalyzer 3.1.1 介绍 IKAnalyzer是一个基于Java语言开发的开源轻量级中文分词工具包。自2006年12月发布1.0版本以来,IKAnalyzer已经经历了多个版本的迭代,不断...
4. **Lucene查询优化**:IKAnalyzer内置了针对Lucene全文检索优化的查询分析器IKQueryParser,利用歧义分析算法优化搜索关键字的排列组合,有效提升Lucene检索的准确性和速度。 #### 二、分词效果示例 通过几个...
Elasticsearch是一款开源的全文搜索引擎,基于Lucene构建。它不仅用于全文搜索,还可用于实时数据分析。Elasticsearch提供了一个分布式、 RESTful 风格的搜索和分析引擎,可用于处理大量结构化和非结构化数据,并...
项目可能遵循SOLID原则,使用面向对象的设计模式,如工厂、单例、装饰器等。 10. **论文部分**:论文将详细阐述系统的设计思路、技术选型、实施过程、遇到的问题及解决方案,对理解和学习该项目有重要参考价值。 ...
9. **设计模式**:在构建复杂系统时,应用设计模式如工厂模式、观察者模式或装饰器模式可以提高代码的可读性和可维护性。 10. **测试和调试**:JUnit和Mockito等Java测试框架可以帮助开发者确保搜索功能的正确性和...
他熟悉装饰器、单例和工厂等主流设计模式,同时对PHP和C语言有所涉猎。 2. **开发工具与版本控制**:熟练使用Eclipse、MyEclipse、IntelliJ IDEA等IDE,能够运用SVN进行版本控制,了解Maven项目构建。 3. **...
- 熟悉Lucene和Compass全文搜索引擎工具包。 - 了解Web Service技术。 - 熟练运用POI开发,处理Excel数据。 - 熟练使用SVN和Maven进行项目管理和构建。 - 熟悉Linux常用命令。 9. **项目经验**: - 在裕隆...
在Java技术方面,景鑫熟练掌握了初级和高级的Java知识,包括反射、泛型和代理等技术,并且熟悉面向对象编程思想和多种设计模式,如单例、装饰、策略、模板、工厂和观察者模式。在Java Web领域,他熟练运用JSP、...
12. **全文搜索引擎**:了解Lucene和Compass,它们是用于实现高效全文搜索的工具。 13. **Web Service**:具备Web服务技术基础,能够创建和消费SOAP或RESTful服务。 14. **POI开发**:熟悉Apache POI库,用于读写...
14. **全文搜索引擎**:Lucene和Compass是全文搜索引擎工具,用于快速索引和搜索文本数据。 15. **Web Service**:一种通过HTTP协议传输数据的服务,用于不同系统间的互操作。 16. **POI**:Apache POI是一个用于...
1. **基础Java知识**:开发者精通Java初级技术,如反射、泛型和代理,同时有面向对象编程经验,并熟知常用设计模式,如单例、装饰、工厂和代理模式。 2. **Java Web技术**:熟练运用JSP、Servlet、Filter、Listener...
他具备扎实的面向对象编程思维,熟悉多种Java设计模式,如单例、装饰、策略、模板、工厂和观察者模式。这表明他对Java编程有深入的理解,并能在实际开发中灵活应用。 在JavaWeb技术上,他熟练掌握JSP、Servlet、...
- 常见设计模式如工厂模式、单例模式、装饰器模式等,代理模式分为静态和动态代理。 19. **面向切面编程(AOP)**: - AOP用于将关注点(如日志、事务管理)与核心业务逻辑分离。 以上知识点是高级开发工程师...
他们有强烈的面向对象编程思想,熟悉各种设计模式,如单例、装饰、策略、模板、工厂和观察者模式。 2. **Java Web技术**:掌握JSP、Servlet、Filter、Listener、Cookie、Session、EL表达式和JSTL等,对HTTP协议有...