职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
UML图如下所示:
demo代码如下。
class Request
{
private:
int m_iType;
string m_strContent ;
int m_iNumber ;
public:
Request(){}
~Request(){}
void SetRequestType( int __n )
{
m_iType = __n ;
}
int GetRequestType( )
{
return m_iType ;
}
void SetRequestContent( const string& __n )
{
m_strContent = __n ;
}
string GetRequestContent( )
{
return m_strContent ;
}
void SetRequestNum( int __n )
{
m_iNumber = __n ;
}
int GetRequestNum( )
{
return m_iNumber ;
}
};
class Manager
{
protected:
Manager* m_pManager ; //上级领导
string m_ManName ;
public:
Manager(const string& __n )
{
m_ManName = __n ;
}
virtual ~Manager(){}
void SetSuperManager( Manager* __m )
{
m_pManager = __m ;
}
virtual void RequestApp( Request* pRequest ){}
};
//经理
class CommonManager: public Manager
{
public:
CommonManager( const string& __n ): Manager( __n ){}
~CommonManager(){}
virtual void RequestApp( Request* pRequest )
{
if ( ( pRequest->GetRequestType() == LEAVE_TYPE )
&& ( pRequest->GetRequestNum() <= 2 ) )
{
std::cout<<m_ManName<<":"<<pRequest->GetRequestContent()<<" num "<<pRequest->GetRequestNum()<<" was allowed"<<std::endl;
}
else
{
if ( m_pManager != NULL )
{
m_pManager->RequestApp( pRequest );
}
}
}
};
//总监
class Majordomo: public Manager
{
public:
Majordomo( const string& __n ): Manager( __n ){}
~Majordomo(){}
virtual void RequestApp( Request* pRequest )
{
if ( ( pRequest->GetRequestType() == LEAVE_TYPE )
&& ( pRequest->GetRequestNum() <= 5 ) )
{
std::cout<<m_ManName<<":"<<pRequest->GetRequestContent()<<" num "<<pRequest->GetRequestNum()<<" was allowed"<<std::endl;
}
else
{
if ( m_pManager != NULL )
{
m_pManager->RequestApp( pRequest );
}
}
}
};
//总经理
class GeneralManager: public Manager
{
public:
GeneralManager( const string& __n ): Manager( __n ){}
~GeneralManager(){}
virtual void RequestApp( Request* pRequest )
{
if ( ( pRequest->GetRequestType() == LEAVE_TYPE ) )
{
std::cout<<m_ManName<<":"<<pRequest->GetRequestContent()<<" num "<<pRequest->GetRequestNum()<<" was allowed"<<std::endl;
}
else if( ( pRequest->GetRequestType() == RAISE_TYPE )
&& ( pRequest->GetRequestNum() <= 500 ) )
{
std::cout<<m_ManName<<":"<<pRequest->GetRequestContent()<<" num "<<pRequest->GetRequestNum()<<" was allowed"<<std::endl;
}
else
{
std::cout<<m_ManName<<":"<<pRequest->GetRequestContent()<<" num "<<pRequest->GetRequestNum()<<" thinking"<<std::endl;
}
}
};
//客户端代码
int main( )
{
CommonManager *pCM = new CommonManager( "CM Wang");
Majordomo *pMD = new Majordomo( "MD Yu");
GeneralManager *pGM= new GeneralManager( "GM JY");
pCM->SetSuperManager( pMD );
pMD->SetSuperManager( pGM );
Request *pRes = new Request() ;
pRes->SetRequestType( LEAVE_TYPE );
pRes->SetRequestContent("I am Leave 2 days");
pRes->SetRequestNum(2);
pCM->RequestApp( pRes );
if ( pRes )
{
delete pRes;
pRes = NULL ;
}
pRes = new Request() ;
pRes->SetRequestType( LEAVE_TYPE );
pRes->SetRequestContent("I am Leave 4 days");
pRes->SetRequestNum(4);
pCM->RequestApp( pRes );
if ( pRes )
{
delete pRes;
pRes = NULL ;
}
pRes = new Request() ;
pRes->SetRequestType( RAISE_TYPE );
pRes->SetRequestContent("I want to raise money 500");
pRes->SetRequestNum(500);
pCM->RequestApp( pRes );
if ( pRes )
{
delete pRes;
pRes = NULL ;
}
pRes = new Request() ;
pRes->SetRequestType( RAISE_TYPE );
pRes->SetRequestContent("I want to raise money 1000");
pRes->SetRequestNum(1000);
pCM->RequestApp( pRes );
return 0;
}
运行结果: