cpp: Visitor Pattern
Posted ®Geovin Du Dream Park™
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cpp: Visitor Pattern相关的知识,希望对你有一定的参考价值。
/*****************************************************************//** * \\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,收费人员收取了我的费用! 取黄金人员将黄金“天赋”拿给了我! 取黄金人员将黄金“高尚”拿给了我! 取黄金人员将黄金“璀璨”拿给了我! 珠宝顾问建议:“天赋”! 珠宝顾问建议:“高尚”! 珠宝顾问建议:“璀璨”! 珠宝顾问建议:“天赋”! 珠宝顾问建议:“高尚”! 珠宝顾问建议:“璀璨”! 请按任意键继续. . .
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
访问者模式(Visitor Pattern)
访问者模式:使用一个访问者类,改变元素的行为。通过这种方式,随着访问者的改变,被访问者的行为可以被改变。
类图:
实现Master接口的具体类是行为需要被改变的对象。
实现Visitor接口的具体类是访问者,访问者不同,实现Master接口的具体类的行为不同。
public interface Master { public abstract String getName(); } public class ConcreteMaster implements Master { private String name; public ConcreteMaster(String name) { this.name = name; } public String getName() { return name; } } public interface Visitor { public abstract void visit(Master master); } public class ConcreteVisitor implements Visitor { public void visit(Master master) { //这里的visit方法仅仅是打印出被访问者的name,改变被访问者的行为的操作就是在这里实现的,不同的Visitor的visit方法不同导致 //被访问者的行为也不同 System.out.println("visit the master " + master.getName()); } }
public class Test { public static void main(String[] args) { Master master = new ConcreteMaster("Amy"); Visitor visitor = new ConcreteVisitor(); visitor.visit(master); } }
测试结果:
以上是关于cpp: Visitor Pattern的主要内容,如果未能解决你的问题,请参考以下文章