拆解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对象不是他的后继处理对象,而是前驱处理对象。其处理顺序为:



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