cpp: Command Pattern
/*****************************************************************//** * \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" using namespace std; /** * @brief 类库空间名 * geovindu edit * */ namespace DuCommonPattern { /// <summary> /// /// </summary> class GeovinDu { private: public: /// <summary> /// 显示实例 /// </summary> void displaySimple(); }; } #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; } }
调用:
/*****************************************************************//** * \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(); system("pause"); return 0; } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 #define UNICODE
输出:
Hello World!!涂聚文 Geovin Du\n制作一条金项链 制作一对黄金耳环 **** 制作一条金项链 制作一对黄金耳环 **** 制作一条金项链 制作一对黄金耳环 **** 制作一条金项链 制作一对黄金耳环 请按任意键继续. . .
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)