職責鏈模式(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對象不是他的後繼處理對象,而是前驅處理對象。其處理順序爲: