/*****************************************************************//** * \file PayrollProcessing.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef PAYROLLPROCESSING_H #define PAYROLLPROCESSING_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> using namespace std; namespace DuJewelryChainOfResponsibilityPattern { /// <summary> /// 薪水处理类 /// </summary> class PayrollProcessing { public: /// <summary> /// 处理加薪请求 /// </summary> /// <param name="sname">员工姓名</param> /// <param name="salfigure">加薪多少</param> void raiseSalaryRequest(const string& sname, int salfigure) //参数1代表要加薪的员工名字,参数2代表求要加薪多少 { if (salfigure <= 1000) { //加薪要求不超过1000,部门经理可以批准 depmentManagerApprove(sname, salfigure); } else if (salfigure <= 5000) { //加薪要求在1000元之上但不超过5000,技术总监才能批准 CTOApprove(sname, salfigure); } else { //加薪要求超过5000元,总经理才能批准 generalManagerApprove(sname, salfigure); } } private: /// <summary> /// 部门经理审批加薪请求 /// </summary> /// <param name="sname">员工姓名</param> /// <param name="salfigure">加薪多少</param> void depmentManagerApprove(const string& sname, int salfigure) { cout << sname << "的加薪要求为:" << salfigure << "元,部门经理审批通过!" << endl; } /// <summary> /// 技术总监审批加薪请求 /// </summary> /// <param name="sname">员工姓名</param> /// <param name="salfigure">加薪多少</param> void CTOApprove(const string& sname, int salfigure) { cout << sname << "的加薪要求为:" << salfigure << "元,技术总监审批通过!" << endl; } /// <summary> /// 总经理审批加薪请求 /// </summary> /// <param name="sname">员工姓名</param> /// <param name="salfigure">加薪多少</param> void generalManagerApprove(const string& sname, int salfigure) { cout << sname << "的加薪要求为:" << salfigure << "元,总经理审批通过!" << endl; } }; } #endif /*****************************************************************//** * \file ParentSalaryApprover.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef PARENTSALARYAPPROVER_H #define PARENTSALARYAPPROVER_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "RaiseSalaryRequest.h" using namespace std; namespace DuChainOfResponsibilityPattern { /// <summary> /// 薪水审批者父类 /// </summary> class ParentSalaryApprover { public: /// <summary> /// /// </summary> ParentSalaryApprover() :nextChain(nullptr) {} /// <summary> /// 做父类时析构函数应该为虚函数 /// </summary> virtual ~ParentSalaryApprover() {} /// <summary> /// 设置指向的职责链中的下个审批者 /// </summary> /// <param name="next"></param> void setNextChain(ParentSalaryApprover* next) { nextChain = next; } /// <summary> /// 处理加薪请求 /// </summary> /// <param name="req"></param> virtual void processRequest(const RaiseSalaryRequest& req) = 0; protected: /// <summary> /// 找链中的下个对象并把请求投递给下个链中的对象 /// </summary> /// <param name="req"></param> void sendRequestToNextHandler(const RaiseSalaryRequest& req) { //找链中的下个对象 if (nextChain != nullptr) { //把请求投递给链中的下个对象 nextChain->processRequest(req); } else { //没找到链中的下个对象,程序流程执行这里似乎不应该 cout << req.getName() << "的加薪要求为:" << req.getSalFigure() << "元,但无人能够审批!" << endl; } } private: /// <summary> /// /// </summary> ParentSalaryApprover* nextChain; //指向下一个审批者(对象)的多态指针(指向自身类型),每个都指向下一个,就会构成一个职责链(链表) }; } #endif /*****************************************************************//** * \file GeneralManagerApprove.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GENERALMANAGERAPPROVER_H #define GENERALMANAGERAPPROVER_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "RaiseSalaryRequest.h" #include "ParentSalaryApprover.h" using namespace std; namespace DuChainOfResponsibilityPattern { /// <summary> /// 总经理子类 /// </summary> class GeneralManagerApprove :public ParentSalaryApprover { public: /// <summary> /// 处理加薪请求 /// </summary> /// <param name="req"></param> virtual void processRequest(const RaiseSalaryRequest& req) { int salfigure = req.getSalFigure(); if (salfigure > 5000) { //如果自己能处理,则自己处理 cout << req.getName() << "的加薪要求为:" << salfigure << "元,总经理审批通过!" << endl; } else { sendRequestToNextHandler(req);//自己不能处理,尝试找链中的下个对象来处理 } } }; } #endif /*****************************************************************//** * \file CTOApprove.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef CTOAPPROVER_H #define CTOAPPROVER_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "RaiseSalaryRequest.h" #include "ParentSalaryApprover.h" using namespace std; namespace DuChainOfResponsibilityPattern { /// <summary> /// 技术总监子类 /// </summary> class CTOApprove :public ParentSalaryApprover { public: /// <summary> /// 处理加薪请求 /// </summary> /// <param name="req"></param> virtual void processRequest(const RaiseSalaryRequest& req) { int salfigure = req.getSalFigure(); if (salfigure > 1000 && salfigure <= 5000) { //如果自己能处理,则自己处理 cout << req.getName() << "的加薪要求为:" << salfigure << "元,技术总监审批通过!" << endl; } else { sendRequestToNextHandler(req);//自己不能处理,尝试找链中的下个对象来处理 } } }; } #endif /*****************************************************************//** * \file DepmentManagerApprove.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef DEPMENTMANAGERAPPROVER_H #define DEPMENTMANAGERAPPROVER_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "RaiseSalaryRequest.h" #include "ParentSalaryApprover.h" using namespace std; namespace DuChainOfResponsibilityPattern { /// <summary> /// 部门经理子类 /// </summary> class DepmentManagerApprove:public ParentSalaryApprover { public: /// <summary> /// 处理加薪请求 /// </summary> /// <param name="req"></param> virtual void processRequest(const RaiseSalaryRequest& req) { int salfigure = req.getSalFigure(); if (salfigure <= 1000) { //如果自己能处理,则自己处理 cout << req.getName() << "的加薪要求为:" << salfigure << "元,部门经理审批通过!" << endl; } else { //自己不能处理,尝试找链中的下个对象来处理 sendRequestToNextHandler(req); } } }; } #endif /*****************************************************************//** * \file RaiseSalaryRequest.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef RAISESALARYREQUEST_H #define RAISESALARYREQUEST_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> using namespace std; namespace DuChainOfResponsibilityPattern { /// <summary> /// 加薪请求类 /// </summary> class RaiseSalaryRequest { public: /// <summary> /// 构造函数 /// </summary> /// <param name="sname"></param> /// <param name="salfigure"></param> RaiseSalaryRequest(const string& sname, int salfigure) :mName(sname), misalFigure(salfigure) {} /// <summary> /// 获取请求加薪的人员名字 /// </summary> /// <returns></returns> const string& getName() const { return mName; } /// <summary> /// 获取请求加薪的数字 /// </summary> /// <returns></returns> int getSalFigure() const { return misalFigure; } private: /// <summary> /// 请求加薪的人员名字 /// </summary> string mName; /// <summary> /// 请求加薪的数字 /// </summary> int misalFigure; }; } #endif /*****************************************************************//** * \file ParentWordFilter.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef PARENTWORDFILTER_H #define PARENTWORDFILTER_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> using namespace std; namespace DuChainOfResponsibilityPattern { /// <summary> /// /// </summary> class ParentWordFilter { public: /// <summary> /// /// </summary> ParentWordFilter() :nextChain(nullptr) {} /// <summary> /// 做父类时析构函数应该为虚函数 /// </summary> virtual ~ParentWordFilter() {} /// <summary> /// 设置指向的职责链中的下个过滤器 /// </summary> /// <param name="next"></param> void setNextChain(ParentWordFilter* next) { nextChain = next; } /// <summary> /// 处理敏感词过滤请求 /// </summary> /// <param name="strWord"></param> /// <returns></returns> virtual string processRequest(string strWord) = 0; protected: /// <summary> /// 找链中的下个对象并把请求投递给下个链中的对象 /// </summary> /// <param name="strWord"></param> /// <returns></returns> string sendRequestToNextHandler(string strWord) { //找链中的下个对象 if (nextChain != nullptr) { //把请求投递给链中的下个对象 return nextChain->processRequest(strWord); } return strWord; } private: /// <summary> /// /// </summary> ParentWordFilter* nextChain; }; } #endif /*****************************************************************//** * \file SexyWordFilter.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef SEXWORDFILTER_H #define SEXWORDFILTER_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "ParentWordFilter.h" using namespace std; namespace DuChainOfResponsibilityPattern { /// <summary> /// /// </summary> class SexyWordFilter:public ParentWordFilter { public: /// <summary> /// /// </summary> /// <param name="strWord"></param> /// <returns></returns> virtual string processRequest(string strWord) { cout << "通过与词库比对,在strWord中查找\"性\"敏感词并用XXX来替换!" << endl; strWord += "XXX"; //测试代码,具体的实现逻辑略...... return sendRequestToNextHandler(strWord); } }; } #endif /*****************************************************************//** * \file DirtyWordFilter.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef DIRTYWORDFILTER_H #define DIRTYWORDFILTER_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "ParentWordFilter.h" using namespace std; namespace DuChainOfResponsibilityPattern { /// <summary> /// 脏话词过滤器子类 /// </summary> class DirtyWordFilter :public ParentWordFilter { public: virtual string processRequest(string strWord) { cout << "通过与词库比对,在strWord中查找\"脏话\"敏感词并用YYY来替换!" << endl; strWord += "YYY"; return sendRequestToNextHandler(strWord); } }; } #endif /*****************************************************************//** * \file PoliticsWordFilter.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef POLITICSWORDFILTER_H #define POLITICSWORDFILTER_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "ParentWordFilter.h" using namespace std; namespace DuChainOfResponsibilityPattern { /// <summary> /// 政治敏感词过滤器子类 /// </summary> class PoliticsWordFilter :public ParentWordFilter { public: virtual string processRequest(string strWord) { cout << "通过与词库比对,在strWord中查找\"政治\"敏感词并用ZZZ来替换!" << endl; strWord += "ZZZ"; return sendRequestToNextHandler(strWord); } }; } #endif /*****************************************************************//** * \file GeovinDu.h * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GEOVINDU_H #define GEOVINDU_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "PayrollProcessing.h" #include "RaiseSalaryRequest.h" #include "ParentSalaryApprover.h" #include "DepmentManagerApprove.h" #include "CTOApprove.h" #include "GeneralManagerApprove.h" #include "ParentWordFilter.h" #include "DirtyWordFilter.h" #include "SexyWordFilter.h" #include "PoliticsWordFilter.h" using namespace std; namespace DuJewelryChainOfResponsibilityPattern { /// <summary> /// /// </summary> class GeovinDu { private: public: /// <summary> /// /// </summary> void displaySimple(); /// <summary> /// /// </summary> void displayDuSimple(); /// <summary> /// /// </summary> void displayWordSimple(); }; } #endif /*****************************************************************//** * \file GeovinDu.cpp * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月7日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #include "GeovinDu.h" using namespace std; using namespace DuChainOfResponsibilityPattern; namespace DuJewelryChainOfResponsibilityPattern { /// <summary> /// /// </summary> void GeovinDu::displaySimple() { DuJewelryChainOfResponsibilityPattern::PayrollProcessing sh; sh.raiseSalaryRequest("张三", 15000); //张三要求加薪1.5万 sh.raiseSalaryRequest("李四", 3500); //李四要求加薪3千5 sh.raiseSalaryRequest("王二", 800); //王二要求加薪8百 } /// <summary> /// /// </summary> void GeovinDu::displayDuSimple() { //(1)创建出职责链中包含的各个对象(部门经理、技术总监、总经理) DuChainOfResponsibilityPattern::ParentSalaryApprover* pzzlinkobj1 = new DuChainOfResponsibilityPattern::DepmentManagerApprove(); DuChainOfResponsibilityPattern::ParentSalaryApprover* pzzlinkobj2 = new DuChainOfResponsibilityPattern::CTOApprove(); DuChainOfResponsibilityPattern::ParentSalaryApprover* pzzlinkobj3 = new DuChainOfResponsibilityPattern::GeneralManagerApprove(); //(2)将这些对象串在一起构成职责链(链表),现在职责链中pzzlinkobj1排在最前面,pzzlinkobj3排在最后面 pzzlinkobj1->setNextChain(pzzlinkobj2); pzzlinkobj2->setNextChain(pzzlinkobj3); pzzlinkobj3->setNextChain(nullptr); //可以不写此行,因为ParSalApprover构造函数中设置了m_nextChain为nullptr //(3)创建几位员工关于加薪的请求(对象) DuChainOfResponsibilityPattern::RaiseSalaryRequest emp1Req("张三", 15000);//张三要求加薪1.5万 DuChainOfResponsibilityPattern::RaiseSalaryRequest emp2Req("李四", 3500);//李四要求加薪3千5 DuChainOfResponsibilityPattern::RaiseSalaryRequest emp3Req("王二", 800);//王二要求加薪8百 //看看每位员工的加薪请求由职责链中的哪个对象(部门经理、技术总监、总经理)来处理,从职责链中排在最前面的接收者(pzzlinkobj1)开始 pzzlinkobj1->processRequest(emp1Req); pzzlinkobj1->processRequest(emp2Req); pzzlinkobj1->processRequest(emp3Req); //(4)释放资源 delete pzzlinkobj1; delete pzzlinkobj2; delete pzzlinkobj3; } /// <summary> /// /// </summary> void GeovinDu::displayWordSimple() { //(1)创建出职责链中包含的各个对象(性敏感词过滤器、脏话词过滤器、政治敏感词过滤器) DuChainOfResponsibilityPattern::ParentWordFilter* pwflinkobj1 = new DuChainOfResponsibilityPattern::SexyWordFilter(); DuChainOfResponsibilityPattern::ParentWordFilter* pwflinkobj2 = new DuChainOfResponsibilityPattern::DirtyWordFilter(); DuChainOfResponsibilityPattern::ParentWordFilter* pwflinkobj3 = new DuChainOfResponsibilityPattern::PoliticsWordFilter(); //(2)将这些对象串在一起构成职责链(链表),现在职责链中pwflinkobj1排在最前面,pwflinkobj3排在最后面 pwflinkobj1->setNextChain(pwflinkobj2); pwflinkobj2->setNextChain(pwflinkobj3); pwflinkobj3->setNextChain(nullptr); string strWordFilterResult = pwflinkobj1->processRequest("你好,这里是过滤敏感词测试范例"); //从职责链中排在最前面的接收者(pwflinkobj1)开始,processRequest的参数代表的是聊天内容 cout << "对敏感词过滤后的结果为:" << strWordFilterResult << endl; //(3)释放资源 delete pwflinkobj1; delete pwflinkobj2; delete pwflinkobj3; } }
调用:
/*****************************************************************//** * \file ConsoleDuChainOfResponsibilityPattern.cpp * \brief 责任链模式Chain Of Responsibility Pattern 亦称: 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility C++ 14 行为模式 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ // ConsoleDuChainOfResponsibilityPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #define _UNICODE #include <iostream> #include "GeovinDu.h" using namespace std; using namespace DuChainOfResponsibilityPattern; using namespace DuJewelryChainOfResponsibilityPattern; int main() { std::cout << "Hello World!涂聚文 Geovin Du\n"; GeovinDu geovin; geovin.displaySimple(); cout << "******************" << endl; geovin.displayDuSimple(); cout << "*****" << endl; geovin.displayWordSimple(); system("pause"); return 0; } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 #define UNICODE
输出
Hello World!涂聚文 Geovin Du 张三的加薪要求为:15000元,总经理审批通过! 李四的加薪要求为:3500元,技术总监审批通过! 王二的加薪要求为:800元,部门经理审批通过! ****************** 张三的加薪要求为:15000元,总经理审批通过! 李四的加薪要求为:3500元,技术总监审批通过! 王二的加薪要求为:800元,部门经理审批通过! ***** 通过与词库比对,在strWord中查找"性"敏感词并用XXX来替换! 通过与词库比对,在strWord中查找"脏话"敏感词并用YYY来替换! 通过与词库比对,在strWord中查找"政治"敏感词并用ZZZ来替换! 对敏感词过滤后的结果为:你好,这里是过滤敏感词测试范例XXXYYYZZZ 请按任意键继续. . .