/*****************************************************************//** * \file Gold.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GOLD_H #define GOLD_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 DuJewelryVisitorPattern { class GoldVisitor; /// <summary> /// 黄金 /// </summary> class Gold { public: /// <summary> /// 这里的形参是访问者父类指针 /// </summary> /// <param name="pvisitor"></param> virtual void Accept(GoldVisitor* pvisitor) = 0; public: /// <summary> /// 名称 /// </summary> /// <returns></returns> virtual string getName() = 0; /// <summary> /// 总价格,单位:元 /// </summary> /// <returns></returns> virtual float getPrice() = 0; }; } #endif /*****************************************************************//** * \file GoldGenius.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GOLDGENIUS_H #define GOLDGENIUS_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 "Gold.h" #include "GoldVisitor.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// 天赋 /// </summary> class GoldGenius:public Gold { public: /// <summary> /// 名称 /// </summary> /// <returns></returns> virtual string getName() { return "天赋"; } /// <summary> /// 价格 /// </summary> /// <returns></returns> virtual float getPrice() { return 46.8f; } public: /// <summary> /// /// </summary> /// <param name="pvisitor"></param> void Accept(GoldVisitor* pvisitor); }; } #endif /*****************************************************************//** * \file GoldGentle.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GOLDGENGLE_H #define GOLDGENGLE_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 "Gold.h" #include "GoldVisitor.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// 高尚 /// </summary> class GoldGentle :public Gold { public: /// <summary> /// 名称 /// </summary> /// <returns></returns> virtual string getName() { return "高尚"; } /// <summary> /// 价格 /// </summary> /// <returns></returns> virtual float getPrice() { return 111.3f; } public: /// <summary> /// /// </summary> /// <param name="pvisitor"></param> void Accept(GoldVisitor* pvisitor); }; } #endif /*****************************************************************//** * \file GoldGlorious.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GOLDGLORIOUS_H #define GOLDGLORIOUS_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 "Gold.h" #include "GoldVisitor.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// 璀璨 /// </summary> class GoldGlorious :public Gold { public: /// <summary> /// 名称 /// </summary> /// <returns></returns> virtual string getName() { return "璀璨"; } /// <summary> /// 价格 /// </summary> /// <returns></returns> virtual float getPrice() { return 122.0f; // } public: /// <summary> /// virtual /// </summary> /// <param name="pvisitor"></param> void Accept(GoldVisitor* pvisitor) ; // }; } #endif /*****************************************************************//** * \file GoldGenius.cpp * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #include "GoldGenius.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// /// </summary> /// <param name="pvisitor"></param> void GoldGenius::Accept(GoldVisitor* pvisitor) { pvisitor->VisitElmGenius(this); } } /*****************************************************************//** * \file GoldGentle.cpp * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #include "GoldGentle.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// /// </summary> /// <param name="pvisitor"></param> void GoldGentle::Accept(GoldVisitor* pvisitor) { pvisitor->VisitElmGentle(this); } } /*****************************************************************//** * \file GoldGlorious.cpp * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #include "GoldGlorious.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// /// </summary> /// <param name="pvisitor"></param> void GoldGlorious::Accept(GoldVisitor* pvisitor) { pvisitor->VisitElmGlorious(this); } } /*****************************************************************//** * \file GoldVisitor.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GOLDVISITOR_H #define GOLDVISITOR_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 "GoldGenius.h" #include "GoldGentle.h" #include "GoldGlorious.h" using namespace std; namespace DuJewelryVisitorPattern { class GoldGenius; class GoldGentle; class GoldGlorious; /// <summary> /// /// </summary> class GoldVisitor { public: /// <summary> /// 做父类时析构函数应该为虚函数 /// </summary> virtual ~GoldVisitor() {} /// <summary> /// 访问元素: virtual = 0 /// </summary> /// <param name="pelem"></param> virtual void VisitElmGenius(GoldGenius* pelem)=0 ; /// <summary> /// 访问元素: /// </summary> /// <param name="pelem"></param> virtual void VisitElmGentle(GoldGentle* pelem)=0; /// <summary> /// 访问元素: /// </summary> /// <param name="pelem"></param> virtual void VisitElmGlorious(GoldGlorious* pelem)=0; ////以下几个接口的名字都叫Visit(成员函数重载) //virtual void Visit(GoldGenius* pelem) = 0; //访问元素: //virtual void Visit(GoldGentle* pelem) = 0; //访问元素: //virtual void Visit(GoldGlorious* pelem) = 0; //访问元素: }; } #endif /*****************************************************************//** * \file ObjectStructure.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef OBJECTSTRUCTURE_H #define OBJECTSTRUCTURE_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 "Gold.h" #include "GoldVisitor.h" #include "GoldGenius.h" #include "GoldGentle.h" #include "GoldGlorious.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// 对象结构 /// </summary> class ObjectStructure { public: /// <summary> /// 增加黄金到黄金列表中 /// </summary> /// <param name="p_mdc"></param> void addGold(Gold* p_mdc) { goldlist.push_back(p_mdc); } /// <summary> /// / /// </summary> /// <param name="pvisitor"></param> void procAction(GoldVisitor* pvisitor) { for (auto iter = goldlist.begin(); iter != goldlist.end(); ++iter) { (*iter)->Accept(pvisitor); } } private: /// <summary> /// 黄金列表 /// </summary> list <Gold*> goldlist; }; } #endif /*****************************************************************//** * \file VisitorConsignee.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef VISITORCONSIGNEE_H #define VISITORCONSIGNEE_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 "Gold.h" #include "GoldVisitor.h" #include "GoldGenius.h" #include "GoldGentle.h" #include "GoldGlorious.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// 取黄金人员 /// </summary> class VisitorConsignee : public GoldVisitor { public: /// <summary> /// /// </summary> /// <param name="pelem"></param> virtual void VisitElmGenius(GoldGenius* pelem) { cout << "取黄金人员将黄金“" << pelem->getName() << "”拿给了我!" << endl; } /// <summary> /// /// </summary> /// <param name="pelem"></param> virtual void VisitElmGentle(GoldGentle* pelem) { cout << "取黄金人员将黄金“" << pelem->getName() << "”拿给了我!" << endl; } /// <summary> /// /// </summary> /// <param name="pelem"></param> virtual void VisitElmGlorious(GoldGlorious* pelem) { cout << "取黄金人员将黄金“" << pelem->getName() << "”拿给了我!" << endl; } }; } #endif /*****************************************************************//** * \file VisitorCounselor.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef VISITORCOUNSELOR_H #define VISITORCOUNSELOR_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 "Gold.h" #include "GoldVisitor.h" #include "GoldGenius.h" #include "GoldGentle.h" #include "GoldGlorious.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// 珠宝顾问 /// </summary> class VisitorCounselor : public GoldVisitor { public: /// <summary> /// 天赋 /// </summary> /// <param name="pelem"></param> virtual void VisitElmGenius(GoldGenius* pelem) { cout << "珠宝顾问建议:“天赋”!" << endl; } /// <summary> /// 高尚 /// </summary> /// <param name="pelem"></param> virtual void VisitElmGentle(GoldGentle* pelem) { cout << "珠宝顾问建议:“高尚”!" << endl; } /// <summary> /// 璀璨 /// </summary> /// <param name="pelem"></param> virtual void VisitElmGlorious(GoldGlorious* pelem) { cout << "珠宝顾问建议:“璀璨”!" << endl; } }; } #endif /*****************************************************************//** * \file VisitorTollCollector.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef VISITORTOLLCOLLECTOR_H #define VISITORTOLLCOLLECTOR_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 "Gold.h" #include "GoldVisitor.h" #include "GoldGenius.h" #include "GoldGentle.h" #include "GoldGlorious.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// 收费人员访问者子类 /// </summary> class VisitorTollCollector : public GoldVisitor { public: /// <summary> /// /// </summary> /// <param name="pelem"></param> virtual void VisitElmGenius(GoldGenius* pelem) { float tmpprice = pelem->getPrice(); cout << "收费人员累计黄金“" << pelem->getName() << "”的价格:" << tmpprice << endl; totalCost += tmpprice; } /// <summary> /// /// </summary> /// <param name="pelem"></param> virtual void VisitElmGentle(GoldGentle* pelem) { float tmpprice = pelem->getPrice(); cout << "收费人员累计黄金“" << pelem->getName() << "”的价格:" << tmpprice << endl; totalCost += tmpprice; } /// <summary> /// /// </summary> /// <param name="pelem"></param> virtual void VisitElmGlorious(GoldGlorious* pelem) { float tmpprice = pelem->getPrice(); cout << "收费人员累计黄金“" << pelem->getName() << "”的价格:" << tmpprice << endl; totalCost += tmpprice; } /// <summary> /// 返回总费用 /// </summary> /// <returns></returns> float getTotalCost() { return totalCost; } private: /// <summary> /// 总费用 /// </summary> float totalCost = 0.0f; }; } #endif /*****************************************************************//** * \file GeovinDu.h * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 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 "Gold.h" #include "GoldVisitor.h" #include "GoldGenius.h" #include "GoldGentle.h" #include "GoldGlorious.h" #include "GoldProcess.h" #include "VisitorConsignee.h" #include "VisitorCounselor.h" #include "VisitorTollCollector.h" #include "ObjectStructure.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// /// </summary> class GeovinDu { private: public: /// <summary> /// /// </summary> void displaySimple(); /// <summary> /// /// </summary> void displayDuSimple(); }; } #endif /*****************************************************************//** * \file GeovinDu.cpp * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ #include "GeovinDu.h" using namespace std; namespace DuJewelryVisitorPattern { /// <summary> /// /// </summary> void GeovinDu::displaySimple() { DuJewelryVisitorPattern::Gold* pm1 = new DuJewelryVisitorPattern::GoldGenius(); DuJewelryVisitorPattern::Gold* pm2 = new DuJewelryVisitorPattern::GoldGentle(); DuJewelryVisitorPattern::Gold* pm3 = new DuJewelryVisitorPattern::GoldGlorious(); DuJewelryVisitorPattern::GoldProcess mdcprocobj; mdcprocobj.addGold(pm1); mdcprocobj.addGold(pm2); mdcprocobj.addGold(pm3); mdcprocobj.procAction("收费人员"); mdcprocobj.procAction("取黄金人员"); //释放资源 delete pm1; delete pm2; delete pm3; } /// <summary> /// /// </summary> void GeovinDu::displayDuSimple() { DuJewelryVisitorPattern::VisitorTollCollector visitorgeovindu; //收费人员访问者子类,里面承载着向我收费的算法 DuJewelryVisitorPattern::GoldGenius goldasplcrp; DuJewelryVisitorPattern::GoldGentle goldfftdnhsp; DuJewelryVisitorPattern::GoldGlorious golddlx; //各个元素子类调用Accept接受访问者的访问,就可以实现访问者要实现的功能 goldasplcrp.Accept(&visitorgeovindu); //累加价格 goldfftdnhsp.Accept(&visitorgeovindu);//累加价格 golddlx.Accept(&visitorgeovindu); //累加价格 cout << "所有黄金的总价为:" << visitor_geovindu.getTotalCost() << ",收费人员收取了我的费用!" << endl; //---- DuJewelryVisitorPattern::VisitorConsignee visitordu; //取黄金员访问者子类,里面承载着向我发黄金的算法 goldasplcrp.Accept(&visitordu); goldfftdnhsp.Accept(&visitordu); golddlx.Accept(&visitordu); //----- DuJewelryVisitorPattern::VisitorCounselor visitorgeovin; //珠宝顾问访问者子类,里面承载着为我配置算法 goldasplcrp.Accept(&visitorgeovin); goldfftdnhsp.Accept(&visitorgeovin); golddlx.Accept(&visitorgeovin); //--------- DuJewelryVisitorPattern::ObjectStructure objstruc; objstruc.addGold(&goldasplcrp); objstruc.addGold(&goldfftdnhsp); objstruc.addGold(&golddlx); objstruc.procAction(&visitorgeovin); } }
调用:
/*****************************************************************//** * \file ConsoleDuVisitorPattern.cpp * \brief 访问者模式 Visitor Pattern C++ 14 行为模式 * 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * * \author geovindu * \date June 2023 *********************************************************************/ // ConsoleDuVisitorPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #define _UNICODE #include <iostream> #include "GeovinDu.h" using namespace std; using namespace DuJewelryVisitorPattern; int main() { std::cout << "Hello World!!涂聚文 Geovin Du\n"; GeovinDu geovin; geovin.displaySimple(); cout << "************" << endl; geovin.displayDuSimple(); system("pause"); return 0; } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 #define UNICODE
输出:
Hello World!!涂聚文 Geovin Du 收费人员累计黄金“天赋”的价格:46.8 收费人员累计黄金“高尚”的价格:111.3 收费人员累计黄金“璀璨”的价格:122 所有黄金的总为:280.1,收费人员收取了我的费用! 取黄金人员将黄金“天赋”拿给了我! 取黄金人员将黄金“高尚”拿给了我! 取黄金人员将黄金“璀璨”拿给了我! ************ 收费人员累计黄金“天赋”的价格:46.8 收费人员累计黄金“高尚”的价格:111.3 收费人员累计黄金“璀璨”的价格:122 所有黄金的总价为:280.1,收费人员收取了我的费用! 取黄金人员将黄金“天赋”拿给了我! 取黄金人员将黄金“高尚”拿给了我! 取黄金人员将黄金“璀璨”拿给了我! 珠宝顾问建议:“天赋”! 珠宝顾问建议:“高尚”! 珠宝顾问建议:“璀璨”! 珠宝顾问建议:“天赋”! 珠宝顾问建议:“高尚”! 珠宝顾问建议:“璀璨”! 请按任意键继续. . .