职责链模式.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;
}