职责链模式(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对象不是他的后继处理对象,而是前驱处理对象。其处理顺序为: