/*****************************************************************//*** \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,收费人员收取了我的费用!
取黄金人员将黄金“天赋”拿给了我!
取黄金人员将黄金“高尚”拿给了我!
取黄金人员将黄金“璀璨”拿给了我!
珠宝顾问建议:“天赋”!
珠宝顾问建议:“高尚”!
珠宝顾问建议:“璀璨”!
珠宝顾问建议:“天赋”!
珠宝顾问建议:“高尚”!
珠宝顾问建议:“璀璨”!
请按任意键继续. . .