您的位置:首页 > 产品设计 > UI/UE

拆解Cluene系列(6)——Analyzer的职责链模式

2016-08-12 10:14 417 查看
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

关于职责链模式,可以参考博文:职责链模式

其UML类图如下:

           


Clucene中StandardAnalyzer用到了职责链模式,相关代码如下:

//这是handler
class StandardTokenizer: public TokenStream
{
public:
bool StandardTokenizer::next(Token* t)
{
....
return true;
}
}

class StandardFilter:public TokenStream
{
bool StandardFilter::next(Token* t)
{
if (!input->next(t))
return false;

//将类似于She's 的token,变成She
//将类似与An.ter 变成Anter
return true;
}
}

class LowerCaseFilter: public TokenStream
{
public:
LowerCaseFilter(TokenStream* in, bool deleteTokenStream):TokenFilter(in,deleteTokenStream) {}
~LowerCaseFilter(){}
bool next(Token* token)
{
if (!input->next(t))
return false;
tolower( t->_termText );//转换成小写
return true;
}
};

class StopFilter: public TokenStream
{
public:
StopFilter(TokenStream* in, bool deleteTokenStream, TCHAR* stopWords[]);
~StopFilter(){}

bool next(Token* token)
{
if (!input->next(t))
return false;
if (table->find(token->_termText)==table->end()) //如果不是停用词,返回true
return true;
return false;
}
};

//这是客户端
class StandardAnalyzer : public Analyzer
{

public:
TokenStream* StandardAnalyzer::tokenStream(const TCHAR* fieldName, Reader* reader)
{
TokenStream* ret = _CLNEW StandardTokenizer(reader);
ret = _CLNEW StandardFilter(ret,true);
ret = _CLNEW LowerCaseFilter(ret,true);
ret = _CLNEW StopFilter(ret,true, &stopSet);
return ret;
}
};
可以看到,这是一个倒职责链模式,也是一个不纯的职责链,即每一个对象处理时,先交给前驱处理,前驱处理完毕后自己再处理。input对象不是他的后继处理对象,而是前驱处理对象。其处理顺序为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Lucene UML Analyzers