/*****************************************************************//**
* \file Gold.h
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
* \author geovindu
* \date 27 May 2023
*********************************************************************/
#pragma once
#ifndef GOLD_H
#define GOLD_H
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
/// <summary>
/// 类
/// </summary>
class Gold
{
public:
/// <summary>
/// 制作金项链
/// </summary>
void GoldNecklace()
{
cout << "制作一条金项链" << endl;
}
/// <summary>
/// 制作黄金耳环
/// </summary>
void GoldEarring()
{
cout << "制作一对黄金耳环" << endl;
}
//做其他各种黄金鉓品......略
};
}
#endif
/*****************************************************************//**
* \file Command.h
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
* \author geovindu
* \date 27 May 2023
*********************************************************************/
#pragma once
#ifndef COMMAND_H
#define COMMAND_H
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
using namespace std;
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
/// <summary>
/// 制作各种黄金饰品对应的抽象类
/// </summary>
class Command
{
public:
/// <summary>
/// 构造函数
/// </summary>
/// <param name="pgold"></param>
Command(Gold* pgold)
{
mPGold = pgold;
}
/// <summary>
/// 做父类时析构函数应该为虚函数
/// </summary>
virtual ~Command()
{
if (mPGold != nullptr)
{
//delete mPGold;
mPGold = nullptr;
}
}
/// <summary>
/// 执行
/// </summary>
virtual void Execute() = 0;
protected:
/// <summary>
/// 子类需要访问
/// </summary>
Gold* mPGold; //
};
}
#endif
/*****************************************************************//**
* \file CommandNecklace.h
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
* \author geovindu
* \date 27 May 2023
*********************************************************************/
#pragma once
#ifndef COMMANDNECKLACE_H
#define COMMANDNECKLACE_H
#include <iostream>
#include <sstream>
#include <vector>
#include "Gold.h"
#include "Command.h"
using namespace std;
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
/// <summary>
/// 制作黄金项链命令
/// </summary>
class CommandNecklace:public Command
{
public:
/// <summary>
/// 构造函数
/// </summary>
/// <param name="pgold"></param>
CommandNecklace(Gold* pgold) :Command(pgold) {}
/// <summary>
/// 执行
/// </summary>
virtual void Execute()
{
mPGold->GoldNecklace();
}
};
}
#endif
/*****************************************************************//**
* \file CommandEarring.h
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
* \author geovindu
* \date 27 May 2023
*********************************************************************/
#pragma once
#ifndef COMMANDEARRING_H
#define COMMANDEARRING_H
#include <iostream>
#include <sstream>
#include <vector>
#include "Gold.h"
#include "Command.h"
using namespace std;
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
/// <summary>
/// 制作黄金耳环命令
/// </summary>
class CommandEarring:public Command
{
public:
/// <summary>
/// 构造函数
/// </summary>
/// <param name="pgold"></param>
CommandEarring(Gold* pgold) :Command(pgold) {}
/// <summary>
/// 执行
/// </summary>
virtual void Execute()
{
mPGold->GoldEarring();
}
};
}
#endif
/*****************************************************************//**
* \file Craftsman.h
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
*
* \author geovindu
* \date May 2023
*********************************************************************/
#pragma once
#ifndef CRAFTSMAN_H
#define CRAFTSMAN_H
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
#include "Command.h"
using namespace std;
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
/// <summary>
/// 工匠
/// </summary>
class Craftsman
{
public:
/// <summary>
/// 添加
/// </summary>
/// <param name="pcommand"></param>
void AddCommand(Command* pcommand)
{
mCommlist.push_back(pcommand);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="pcommand"></param>
void DelCommand(Command* pcommand)
{
mCommlist.remove(pcommand);
}
/// <summary>
/// 收到多个制作BOM单,按顺序制作
/// </summary>
void Notify()
{
for (auto iter = mCommlist.begin(); iter != mCommlist.end(); ++iter)
{
(*iter)->Execute();
}
}
private:
/// <summary>
/// 多个制作BOM单列表
/// </summary>
std::list<Command*> mCommlist;
};
}
#endif
/*****************************************************************//**
* \file TraineeCraftsman.h
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
* \author geovindu
* \date May 2023
*********************************************************************/
#pragma once
#ifndef CRAFTSMAN_H
#define CRAFTSMAN_H
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
#include "Command.h"
using namespace std;
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
/// <summary>
/// 实习工匠
/// </summary>
class TraineeCraftsman
{
public:
/// <summary>
/// 构造函数
/// </summary>
/// <param name="pCommand"></param>
TraineeCraftsman(Command* pCommand) :mPCommand(pCommand) {}
/// <summary>
/// 实习工匠交给工匠开始制作首饰
/// </summary>
void Notify()
{
mPCommand->Execute();
}
/// <summary>
/// 析构函数
/// </summary>
~TraineeCraftsman() //
{
if (mPCommand != nullptr)
{
delete mPCommand;
mPCommand = nullptr;
}
}
private:
/// <summary>
/// 实习工匠,有BOM清单列表
/// </summary>
Command* mPCommand;
};
}
#endif
/*****************************************************************//**
* \file CraftsmanOld.h
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
* \author geovindu
* \date May 2023
*********************************************************************/
#pragma once
#ifndef CRAFTSMANOLD_H
#define CRAFTSMANOLD_H
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
#include "Command.h"
using namespace std;
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
/// <summary>
///
/// </summary>
class CraftsmanOld
{
public:
/// <summary>
///
/// </summary>
/// <param name="pcommand"></param>
void SetCommand(Command* pcommand)
{
mPCommand = pcommand;
}
/// <summary>
///
/// </summary>
void Notify()
{
mPCommand->Execute();
}
private:
/// <summary>
///
/// </summary>
Command* mPCommand;
};
}
#endif
/*****************************************************************//**
* \file GeovinDu.h
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
* \author geovindu
* \date May 2023
*********************************************************************/
#pragma once
#ifndef GEOVINDU_H
#define GEOVINDU_H
#include <iostream>
#include <sstream>
#include <vector>
#include <list>
#include "Gold.h"
#include "Command.h"
#include "CommandEarring.h"
#include "CommandMacro.h"
#include "CommandNecklace.h"
#include "Craftsman.h"
#include "TraineeCraftsman.h"
#include "CraftsmanOld.h"
#include "TrainingCommand.h"
using namespace std;
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
/// <summary>
///
/// </summary>
class GeovinDu
{
private:
public:
/// <summary>
/// 显示实例
/// </summary>
void displaySimple();
/// <summary>
///
/// </summary>
void displayTrainee();
};
//函数模板
template <class T> //T代表可调用对象的类型
void funcTmpTest(T callobj)//callobj是个可调用对象
{
callobj(100);
return;
}
}
#endif
/*****************************************************************//**
* \file GeovinDu.cpp
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
* \author geovindu
* \date May 2023
*********************************************************************/
#include "GeovinDu.h"
using namespace std;
/**
* @brief 类库空间名
* geovindu edit
*
*/
namespace DuCommonPattern
{
/// <summary>
/// 实例
/// </summary>
void GeovinDu::displaySimple()
{
DuCommonPattern::Gold* pgold = new DuCommonPattern::Gold();
pgold->GoldNecklace();
pgold->GoldEarring();
cout << "****" << endl;
DuCommonPattern::Gold gold1;
DuCommonPattern::Command* pcmd1 = new DuCommonPattern::CommandNecklace(&gold1);
pcmd1->Execute();
DuCommonPattern::Command* pcmd2 = new DuCommonPattern::CommandEarring(&gold1);
pcmd2->Execute();
cout << "****" << endl;
DuCommonPattern::Gold gold2;
DuCommonPattern::CraftsmanOld* pcraftsman = new DuCommonPattern::CraftsmanOld();
DuCommonPattern::Command* pcmd4 = new DuCommonPattern::CommandNecklace(&gold2);
pcraftsman->SetCommand(pcmd4);
pcraftsman->Notify();
DuCommonPattern::Command* pcmd5 = new DuCommonPattern::CommandEarring(&gold2);
pcraftsman->SetCommand(pcmd5);
pcraftsman->Notify();
cout << "****" << endl;
DuCommonPattern::Gold gold3;
DuCommonPattern::Command* pcmd3 = new DuCommonPattern::CommandNecklace(&gold3);
DuCommonPattern::Command* pcmd6 = new DuCommonPattern::CommandEarring(&gold3);
DuCommonPattern::Craftsman* pcraftsman2 = new DuCommonPattern::Craftsman();
pcraftsman2->AddCommand(pcmd3);
pcraftsman2->AddCommand(pcmd6);
pcraftsman2->Notify();
//释放资源
delete pgold;
//释放资源
delete pcmd1;
delete pcmd2;
//释放资源
delete pcmd4;
delete pcmd5;
delete pcraftsman;
//释放资源
delete pcmd3;
delete pcmd6;
delete pcraftsman2;
}
/// <summary>
///
/// </summary>
void GeovinDu::displayTrainee()
{
DuCommonPattern::TraineeCraftsman* ptrainee1 = new DuCommonPattern::TraineeCraftsman(new DuCommonPattern::CommandNecklace(new DuCommonPattern::Gold()));
ptrainee1->Notify();
DuCommonPattern::TraineeCraftsman* ptrainee2 = new DuCommonPattern::TraineeCraftsman(new DuCommonPattern::CommandEarring(new DuCommonPattern::Gold()));
ptrainee2->Notify();
//释放资源
delete ptrainee1;
delete ptrainee2;
DuCommonPattern::TrainingCommand tc;
tc(20); //调用的是()操作符,这就是个可调用对象。等价于tc.operator()(20);
cout << tc(30, 50) << endl;
DuCommonPattern::funcTmpTest(tc);
}
}
调用:
/*****************************************************************//**
* \file ConsoleDuCommandPattern.cpp
* \brief Command Pattern 命令模式 亦称:动作、事务、Action、Transaction、Command C++ 14
* 涂聚文 Geovin Du Visual Studio 2022 edit.
*
* \author geovindu
* \date 26 May 2023
*********************************************************************/
// ConsoleDuCommandPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//2023年5月26日 涂聚文 Geovin Du Visual Studio 2022 edit.
#define _UNICODE
#include <iostream>
#include <list>
#include "GeovinDu.h"
#ifdef _DEBUG //只在Debug(调试)模式下
#ifndef DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符
#define new DEBUG_NEW
#endif
#endif
using namespace std;
using namespace DuCommonPattern;
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口
std::cout << "Hello World!!涂聚文 Geovin Du\n";
GeovinDu geovin;
geovin.displaySimple();
cout << "2 simple" << endl;
geovin.displayTrainee();
system("pause");
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
#define UNICODE
输出:
Hello World!!涂聚文 Geovin Du
制作一条金项链
制作一对黄金耳环
****
制作一条金项链
制作一对黄金耳环
****
制作一条金项链
制作一对黄金耳环
****
制作一条金项链
制作一对黄金耳环
2 simple
制作一条金项链
制作一对黄金耳环
TrainingCommand::operator(int tv)执行了,tv=20
TrainingCommand::operator(int tv1,int tv2)执行了,tv1=30,tv2=50
1
TrainingCommand::operator(int tv)执行了,tv=100
请按任意键继续. . .