拆解Cluene系列(6)——Analyzer的職責鏈模式

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章