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

  

 

访问者模式(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的主要内容,如果未能解决你的问题,请参考以下文章

访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern)

22访问者模式(Visitor Pattern)

Design Pattern Visitor 訪问者设计模式