职责链模式.cpp
# include <iostream>
# include <memory>
# include <string>
using namespace std;
namespace ns1
{ class SalaryHandler { void depManagerSP ( const string & sname, int salfigure) const { cout << sname << " ask for a raise: " << salfigure << ", manager agree!" << endl; } void CTOSP ( const string & sname, int salfigure) const { cout << sname << " ask for a raise: " << salfigure << ", Technical Director agree!" << endl; } void genManagerSP ( const string & sname, int salfigure) const { cout << sname << " ask for a raise: " << salfigure << ", general manager agree!" << endl; } public : void raiseRequest ( const string & sname, int salfigure) const { if ( salfigure <= 1000 ) depManagerSP ( sname, salfigure) ; else if ( salfigure <= 5000 ) CTOSP ( sname, salfigure) ; else genManagerSP ( sname, salfigure) ; } } ;
} namespace ns2
{ class RaiseRequest { string m_sname; int m_isalfigure; public : RaiseRequest ( const string & sname, int salfigure) : m_sname ( sname) , m_isalfigure ( salfigure) { } const string & getName ( ) const { return m_sname; } int getSalFigure ( ) const { return m_isalfigure; } } ; class ParSalApprover { shared_ptr< ParSalApprover> m_nextChain; protected : void sendRequestToNextHandler ( const RaiseRequest & req) const { if ( m_nextChain != nullptr ) m_nextChain-> processRequest ( req) ; else cout << req. getName ( ) << " ask for a raise: " << req. getSalFigure ( ) << ", nobody agree!" << endl; } public : ParSalApprover ( const shared_ptr< ParSalApprover> & next = nullptr ) : m_nextChain ( next) { } virtual ~ ParSalApprover ( ) { } void setNextChain ( const shared_ptr< ParSalApprover> & next) { m_nextChain = next; } virtual void processRequest ( const RaiseRequest & req) const = 0 ; } ; class depManager_SA : public ParSalApprover { public : depManager_SA ( const shared_ptr< ParSalApprover> & next = nullptr ) : ParSalApprover ( next) { } void processRequest ( const RaiseRequest & req) const override { int salfigure = req. getSalFigure ( ) ; if ( salfigure <= 1000 ) cout << req. getName ( ) << " ask for a raise: " << salfigure << ", manager agree!" << endl; else sendRequestToNextHandler ( req) ; } } ; class CTO_SA : public ParSalApprover { public : CTO_SA ( const shared_ptr< ParSalApprover> & next = nullptr ) : ParSalApprover ( next) { } void processRequest ( const RaiseRequest & req) const override { int salfigure = req. getSalFigure ( ) ; if ( salfigure > 1000 && salfigure <= 5000 ) cout << req. getName ( ) << " ask for a raise: " << salfigure << ", CTO_SA agree!" << endl; else sendRequestToNextHandler ( req) ; } } ; class genManager_SA : public ParSalApprover { public : genManager_SA ( const shared_ptr< ParSalApprover> & next = nullptr ) : ParSalApprover ( next) { } void processRequest ( const RaiseRequest & req) const override { int salfigure = req. getSalFigure ( ) ; if ( salfigure > 5000 ) cout << req. getName ( ) << " ask for a raise: " << salfigure << ", genManager_SA agree!" << endl; else sendRequestToNextHandler ( req) ; } } ;
} namespace ns3
{ class ParWordFilter { shared_ptr< ParWordFilter> m_nextChain{ nullptr } ; protected : string sendRequestToNextHandler ( const string & strWord) const { if ( m_nextChain != nullptr ) return m_nextChain-> processRequest ( strWord) ; return strWord; } public : virtual ~ ParWordFilter ( ) { } void setNextChain ( const shared_ptr< ParWordFilter> & next) { m_nextChain = next; } virtual string processRequest ( const string & strWord) const = 0 ; } ; class SexyWordFilter : public ParWordFilter { public : string processRequest ( const string & strWord) const override { cout << "replace sex with XXX!" << endl; return sendRequestToNextHandler ( strWord + "XXX" ) ; } } ; class DirtyWordFilter : public ParWordFilter { public : string processRequest ( const string & strWord) const override { cout << "replace obscenities with YYY!" << endl; return sendRequestToNextHandler ( strWord + "YYY" ) ; } } ; class PoliticsWordFilter : public ParWordFilter { public : string processRequest ( const string & strWord) const override { cout << "replace politices with ZZZ!" << endl; return sendRequestToNextHandler ( strWord + "ZZZ" ) ; } } ;
} namespace ns4
{ class AbstractLogger { public : static int INFO; static int DEBUG; static int ERROR; public : virtual ~ AbstractLogger ( ) = default ; AbstractLogger ( int m_level) : level ( m_level) { } void setNextLogger ( const shared_ptr< AbstractLogger> & m_nextLogger) { nextLogger = m_nextLogger; } void logMessage ( int m_level, const string & message) { if ( level <= m_level) write ( message) ; if ( nextLogger != nullptr ) nextLogger-> logMessage ( m_level, message) ; } protected : int level; shared_ptr< AbstractLogger> nextLogger; virtual void write ( const string & message) const = 0 ; } ; int AbstractLogger:: INFO = 1 ; int AbstractLogger:: DEBUG = 2 ; int AbstractLogger:: ERROR = 3 ; class ConsoleLogger : public AbstractLogger { public : ConsoleLogger ( int level) : AbstractLogger ( level) { } protected : void write ( const string & message) const override { cout << "Standard Console::Logger: " + message << endl; } } ; class ErrorLogger : public AbstractLogger { public : ErrorLogger ( int level) : AbstractLogger ( level) { } protected : void write ( const string & message) const override { cout << "ErrorLogger Console::Logger: " + message << endl; } } ; class FileLogger : public AbstractLogger { public : FileLogger ( int level) : AbstractLogger ( level) { } protected : void write ( const string & message) const override { cout << "FileLogger Console::Logger: " + message << endl; } } ; shared_ptr< AbstractLogger> getChainOfLoggers ( ) { shared_ptr< AbstractLogger> errorLogger = make_shared < ErrorLogger> ( AbstractLogger:: ERROR) ; shared_ptr< AbstractLogger> fileLogger = make_shared < FileLogger> ( AbstractLogger:: DEBUG) ; shared_ptr< AbstractLogger> consoleLogger = make_shared < ConsoleLogger> ( AbstractLogger:: INFO) ; errorLogger-> setNextLogger ( fileLogger) ; fileLogger-> setNextLogger ( consoleLogger) ; return errorLogger; }
} int main ( )
{
# if 0 ns1:: SalaryHandler sh; sh. raiseRequest ( "zs" , 15000 ) ; sh. raiseRequest ( "ls" , 3500 ) ; sh. raiseRequest ( "we" , 800 ) ;
# endif # if 0 using namespace ns2; shared_ptr< ParSalApprover> pzzlinkobj3 ( new genManager_SA ( ) ) ; shared_ptr< ParSalApprover> pzzlinkobj2 ( new CTO_SA ( pzzlinkobj3) ) ; shared_ptr< ParSalApprover> pzzlinkobj1 ( new depManager_SA ( pzzlinkobj2) ) ; RaiseRequest emp1Req ( "zs" , 15000 ) ; RaiseRequest emp2Req ( "ls" , 3500 ) ; RaiseRequest emp3Req ( "we" , 800 ) ; pzzlinkobj1-> processRequest ( emp1Req) ; pzzlinkobj1-> processRequest ( emp2Req) ; pzzlinkobj1-> processRequest ( emp3Req) ;
# endif # if 0 using namespace ns3; shared_ptr< ParWordFilter> pwflinkobj1 ( new SexyWordFilter ( ) ) ; shared_ptr< ParWordFilter> pwflinkobj2 ( new DirtyWordFilter ( ) ) ; shared_ptr< ParWordFilter> pwflinkobj3 ( new PoliticsWordFilter ( ) ) ; pwflinkobj1-> setNextChain ( pwflinkobj2) ; pwflinkobj2-> setNextChain ( pwflinkobj3) ; pwflinkobj3-> setNextChain ( nullptr ) ; string strWordFilterResult = pwflinkobj1-> processRequest ( "Hello, here is an example of filtering sensitive words test" ) ; cout << "The result of filtering sensitive words is: " << strWordFilterResult << endl;
# endif # if 1 using namespace ns4; shared_ptr< AbstractLogger> loggerChain = getChainOfLoggers ( ) ; loggerChain-> logMessage ( AbstractLogger:: INFO, "This is an information." ) ; loggerChain-> logMessage ( AbstractLogger:: DEBUG, "This is a debug level information." ) ; loggerChain-> logMessage ( AbstractLogger:: ERROR, "This is an error information." ) ;
# endif cout << "Over!\n" ; return 0 ;
}