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