cpp: Strategy Pattern II
// Gold.h : 此文件包含 "Gold" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once //#ifndef GOLD_H //#define GOLD_H #ifndef _GOLD_ #define _GOLD_ #include <iostream> #include <sstream> #include <vector> #include "StrategyProfile.h" using namespace std; namespace DuJewelryStrategyPattern { ////增加策略 enum ItemAddlife { LF_Corporation, LF_Commerce, LF_Shop, }; class StrategyProfile;//类前向声明 /// <summary> /// 黄金 父类 /// </summary> class Gold { public: Gold(int operation, int intellectual, int resource) :Poperation(operation), Pintellectual(intellectual), Presource(resource) {} virtual ~Gold() {} //public: // void UseItem(ItemAddlife djtype) // // { // if (djtype == LF_Corporation) // // { // Poperation += 200; //补充200点生命值 // //if (主角) // //{ // // 停止状态,也 // //} // //if (主角状态) // //{ // // Poperation += 400; //额外再补充400点 // // Pintellectual += 200; //也再补充200点 // //} // } // else if (djtype == LF_Commerce ) // // { // Poperation += 300; //补充300点生命值 // } // else if (djtype == LF_Shop) // // { // Poperation += 500; //补充500点生命 // } // //其他的一些判断逻辑,略...... // } public: /// <summary> /// /// </summary> /// <param name="strategy"></param> void SetStrategyProfile(StrategyProfile* strategy); // /// <summary> /// / /// </summary> void UseItem(); /// <summary> /// 获取运营管理 /// </summary> /// <returns></returns> int GetOperation(); /// <summary> /// 设置运营管理 /// </summary> /// <param name="operation"></param> void SetOperation(int operation); // private: /// <summary> /// /// </summary> StrategyProfile* strategyProfile = nullptr; //C++11中支持这样初始化 protected: /// <summary> /// 运营管理 operation /// </summary> int Poperation; /// <summary> /// 智能技术 intellectual technology /// </summary> int Pintellectual; /// <summary> /// 资源配置 (整合)resource allocation /// </summary> int Presource; }; } #endif // Gold.cpp 此文件包含 "Gold" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #include <iostream> #include "Gold.h" #include "StrategyProfile.h" using namespace std; namespace DuJewelryStrategyPattern { /// <summary> /// 设置组合使用的策略 /// </summary> /// <param name="strategy"></param> void Gold::SetStrategyProfile(StrategyProfile* strategy) { strategyProfile = strategy; } //1例用法 /// <summary> /// 使用组合策略 /// </summary> void Gold::UseItem() { strategyProfile->UseItem(this); //this } /** 2 例用法 /// <summary> /// 使用组合策略 /// </summary> void Gold::UseItem() { strategyProfile->UseItem(); //this } */ /// <summary> /// 获取运营管理 /// </summary> /// <returns></returns> int Gold::GetOperation() { return Poperation; } /// <summary> /// 设置运营管理 /// </summary> /// <param name="operation"></param> void Gold::SetOperation(int operation) { Poperation = operation; } } // StrategyProfile.h : 此文件包含 "StrategyProfile" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once //#ifndef STRATEGYPROFILE_H //#define STRATEGYPROFILE_H #ifndef _STRATEGYPROFILE_ #define _STRATEGYPROFILE_ #include <iostream> #include <sstream> #include <vector> #include "Gold.h" using namespace std; namespace DuJewelryStrategyPattern { class Gold;//类前向声明 /// <summary> /// 策略组合 父类 策略类的父类 /// </summary> class StrategyProfile { private: public: /** 1 例用法*/ /// <summary> /// /// </summary> /// <param name="mainobj"></param> virtual void UseItem(Gold* mainobj)=0; /*2 例用法 /// <summary> /// /// </summary> virtual void UseItem() = 0; */ /// <summary> /// /// </summary> /// <param name="mainobj"></param> //void DuUseItem(Gold* mainobj); /// <summary> /// /// </summary> virtual ~StrategyProfile() {} }; } #endif // StrategyMarketFocus.h : 此文件包含 "StrategyMarketFocus" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once #ifndef STRATEGYMARKETFOCUS_H #define STRATEGYMARKETFOCUS_H #include <iostream> #include <sstream> #include <vector> #include "Gold.h" #include "StrategyProfile.h" using namespace std; namespace DuJewelryStrategyPattern { /// <summary> ///子类 专一化战略(Market focus/focus strategy),也称集中化战略(集中策略)、目标集中战略、目标聚集战略、目标聚集性战略 /// </summary> class StrategyMarketFocus :public StrategyProfile { public: /// <summary> /// 专一化战略 /// </summary> /// <param name="mainobj"></param> virtual void UseItem(Gold* mainobj) { mainobj->SetOperation(mainobj->GetOperation() + 500); //补充500点生命值 int operatin = mainobj->GetOperation(); cout << "执行专一化战略,营收增长" + to_string(operatin) + "%" << endl; } }; } #endif // StrategyDifferentiation.h : 此文件包含 "StrategyDifferentiation" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once #ifndef STRATEGYDIFFERENTIATION_H #define STRATEGYDIFFERENTIATION_H #include <iostream> #include <sstream> #include <vector> #include "Gold.h" #include "StrategyProfile.h" using namespace std; namespace DuJewelryStrategyPattern { /// <summary> ///子类 /// 差异化战略(differentiation/differentiation strategy) /// </summary> class StrategyDifferentiation :public StrategyProfile { public: /// <summary> /// /// </summary> /// <param name="mainobj"></param> virtual void UseItem(Gold* mainobj) { mainobj->SetOperation(mainobj->GetOperation() + 300); //补充300点 int operatin = mainobj->GetOperation(); cout << "执行差异化战略,营收增长"+to_string(operatin)+"%" << endl; } }; } #endif // StrategyOverallCost.h : 此文件包含 "StrategyOverallCost" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once #ifndef STRATEGYOVERALLCOST_H #define STRATEGYOVERALLCOST_H #include <iostream> #include <sstream> #include <vector> #include "Gold.h" #include "StrategyProfile.h" using namespace std; namespace DuJewelryStrategyPattern { /// <summary> /// 子类 成本领先战略(Overall cost leadership,也称低成本战略) /// </summary> class StrategyOverallCost:public StrategyProfile { public: /// <summary> /// 成本领先战略 /// </summary> /// <param name="mainobj"></param> virtual void UseItem(Gold* mainobj) { mainobj->SetOperation(mainobj->GetOperation() + 200); //补充200点 int operatin = mainobj->GetOperation(); cout << "执行成本领先战略,营收增长" + to_string(operatin) + "%" << endl; } }; } #endif // GeovinDu.cpp : 此文件包含 "GeovinDu" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #include "GeovinDu.h" #include <iostream> #include <sstream> #include <vector> #include "Gold.h" #include "GoldShop.h" #include "GoldCommerce.h" #include "GoldCorporation.h" #include "SupplierDiamond.h" #include "SupplierGold.h" #include "SupplierJade.h" #include "SupplierPearl.h" #include "SupplierIncrement.h" #include "StrategyProfile.h" #include "StrategyDifferentiation.h" #include "StrategyMarketFocus.h" #include "StrategyOverallCost.h" using namespace std; using namespace DuJewelryStrategyPatternUnabstract; namespace DuJewelryStrategyPattern { /// <summary> /// /// </summary> void GeovinDu::displayUnabstract() { //Gold* prole_war = new SupplierIncrement(1000, 0, 200);//这没有采用工厂模式,如果主角很多,可以考虑采用工厂模式创建对象 //prole_war->UseItem(LF_Corporation); //delete prole_war; //创建主角 Gold* prole_shop = new GoldShop(1000, 0, 200); //成本策略1 //StrategyProfile* strateby; //StrategyOverallCost d; //strateby = &d; /* 1 例 问题: 无法实例化抽象类 已解决*/ StrategyProfile* strateby = new StrategyOverallCost(); //创建成本策略 prole_shop->SetStrategyProfile(strateby); //主角设置策略 prole_shop->UseItem(); //主角 //差异化战略 StrategyProfile* strateby2 = new StrategyDifferentiation(); //创建差异化战略 prole_shop->SetStrategyProfile(strateby2); //主角设置策略 prole_shop->UseItem(); //主角用策略 //释放资源 delete strateby; delete strateby2; delete prole_shop; // 2 例------------------------------ /* DuJewelryStrategyPatternUnabstract::SupplierGold* pobjud = new DuJewelryStrategyPatternUnabstract::SupplierGold(); DuJewelryStrategyPatternUnabstract::SupplierIncrement* pobjwar = new DuJewelryStrategyPatternUnabstract::SupplierIncrement(); pobjwar->createSupplierGold(pobjud); //创建一个黄金供应商 DuJewelryStrategyPatternUnabstract::SupplierDiamond* pobjelm = new DuJewelryStrategyPatternUnabstract::SupplierDiamond(); pobjwar->createSupplierDiamond(pobjelm);//创建一个钻石供应商 //资源释放 delete pobjwar; delete pobjud; delete pobjelm; */ } }
调用:
// ConsoleDuStrategyPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // 策略模式 Strategy Pattern // // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. // #define _UNICODE #include <iostream> #include "GeovinDu.h" #include "SupplierIncrement.h" #ifdef _DEBUG //只在Debug(调试)模式下 #ifndef DEBUG_NEW #define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符 #define new DEBUG_NEW #endif #endif //#include <boost/type_index.hpp> using namespace std; //#pragma warning(disable : 4996) using namespace DuJewelryStrategyPattern; using namespace DuJewelryStrategyPatternUnabstract; int main() { std::cout << "Hello World!!Programa Olá Mundo!涂聚文 Geovin Du\n"; GeovinDu geovin; geovin.displayUnabstract(); system("pause"); return 0; } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 #define UNICODE
输出:
Hello World!!Programa Olá Mundo!涂聚文 Geovin Du 执行成本领先战略,营收增长1200% 执行差异化战略,营收增长1500% 请按任意键继续. . .
// Gold.h : 此文件包含 "Gold" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once //#ifndef GOLD_H //#define GOLD_H #ifndef _GOLD_ #define _GOLD_ #include <iostream> #include <sstream> #include <vector> #include "StrategyProfile.h" using namespace std; namespace DuJewelryStrategyPattern { ////增加策略 enum ItemAddlife { /// <summary> /// 黄金公司 /// </summary> LF_Corporation, /// <summary> /// 商贸商会 /// </summary> LF_Commerce, /// <summary> /// 店舖 /// </summary> LF_Shop, }; /// <summary> /// /// </summary> enum ItemOperating { /// <summary> /// /// </summary> colse, /// <summary> /// /// </summary> bussines, }; class StrategyProfile;//类前向声明 /// <summary> /// 黄金 父类 /// </summary> class Gold { public: Gold(int operation, int intellectual, int resource) :Poperation(operation), Pintellectual(intellectual), Presource(resource) {} virtual ~Gold() {} public: /// <summary> /// /// </summary> /// <param name="djtype"></param> /// <param name="operate"></param> void UseItem(ItemAddlife djtype, ItemOperating operate) // { if (djtype == LF_Corporation) //类型: { int oldp = Poperation; int oldi = Pintellectual; int oldr = Presource; Poperation += 200; //补充200点 poisoning if (operate ==colse) { // cout << "黄金公司歇业中,为了更好的准备迎接新的增长点!" << endl; } if (operate ==bussines) //musth { Poperation += 400; //再补充400点 Pintellectual += 200; //也再补充200点 cout << "黄金公司营业中,运营增长:("+to_string(oldp) +")"+to_string(Poperation - oldp)+",智能技术增长:(" + to_string(oldi) + ")" +to_string(Pintellectual - oldi)+",资源增长:(" + to_string(oldr) + ")" +to_string(Presource - oldr) << endl; } } else if (djtype == LF_Commerce ) // { int oldp = Poperation; int oldi = Pintellectual; int oldr = Presource; if (operate ==colse) { cout << "商贸商会歇业中,为了更好的准备迎接新的增长点!" << endl; } if (operate ==bussines) { Poperation += 300; //补充300点 cout << "商贸商会营业中,运营增长:(" + to_string(oldp) + ")" + to_string(Poperation- oldp) + ",智能技术增长:(" + to_string(oldi) + ")" + to_string(Pintellectual-oldi) + ",资源增长:(" + to_string(oldr) + ")" + to_string(Presource-oldr) << endl; } } else if (djtype == LF_Shop) // { int oldp = Poperation; int oldi = Pintellectual; int oldr = Presource; if (operate ==colse) { cout << "店舖歇业中,为了更好的准备迎接新的增长点!" << endl; } if (operate ==bussines) { Poperation += 500; //补充500点 cout << "店舖营业中,运营增长:(" + to_string(oldp) + ")" + to_string(Poperation- oldp) + ",智能技术增长:(" + to_string(oldi) + ")" + to_string(Pintellectual - oldi) + ",资源增长:(" + to_string(oldr) + ")" + to_string(Presource - oldr) << endl; } } //其他的一些判断逻辑,略...... } public: /// <summary> /// /// </summary> /// <param name="strategy"></param> void SetStrategyProfile(StrategyProfile* strategy); //设置道具使用的策略 /// <summary> /// / /// </summary> void UseItem(); // /// <summary> /// 获取运营管理 /// </summary> /// <returns></returns> int GetOperation(); /// <summary> /// 设置运营管理 /// </summary> /// <param name="operation"></param> void SetOperation(int operation); // private: /// <summary> /// /// </summary> StrategyProfile* strategyProfile = nullptr; //C++11中支持这样初始化 protected: /// <summary> /// 运营管理 operation /// </summary> int Poperation; /// <summary> /// 智能技术 intellectual technology /// </summary> int Pintellectual; /// <summary> /// 资源配置 (整合)resource allocation /// </summary> int Presource; }; } #endif // GeovinDu.cpp : 此文件包含 "GeovinDu" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #include "GeovinDu.h" #include <iostream> #include <sstream> #include <vector> #include "Gold.h" #include "GoldShop.h" #include "GoldCommerce.h" #include "GoldCorporation.h" #include "SupplierDiamond.h" #include "SupplierGold.h" #include "SupplierJade.h" #include "SupplierPearl.h" #include "SupplierIncrement.h" #include "StrategyProfile.h" #include "StrategyDifferentiation.h" #include "StrategyMarketFocus.h" #include "StrategyOverallCost.h" using namespace std; using namespace DuJewelryStrategyPatternUnabstract; namespace DuJewelryStrategyPattern { class Gold; /// <summary> /// /// </summary> void GeovinDu::displayUnabstract() { Gold* prole_cor = new GoldCorporation(1000,20,500);//这没有采用工厂模式,如果主角很多,可以考虑采用工厂模式创建对象 prole_cor->UseItem(LF_Corporation,colse); delete prole_cor; //创建主角 Gold* prole_shop = new GoldShop(1000, 0, 200); prole_shop->UseItem(LF_Shop, bussines); Gold* prole_Com = new GoldCommerce(8000, 20, 400); //成本策略1 //StrategyProfile* strateby; //StrategyOverallCost d; //strateby = &d; /* 1 例 问题: 无法实例化抽象类 已解决*/ StrategyProfile* strateby = new StrategyOverallCost(); //创建成本策略 prole_shop->SetStrategyProfile(strateby); //主角设置大还丹策略,准备吃大还丹 prole_shop->UseItem(); //主角吃大还丹 //差异化战略 StrategyProfile* strateby2 = new StrategyDifferentiation(); //创建差异化战略 prole_shop->SetStrategyProfile(strateby2); //主角设置策略 prole_shop->UseItem(); //主角用策略 //释放资源 delete strateby; delete strateby2; delete prole_shop; // 2 例------------------------------ /* DuJewelryStrategyPatternUnabstract::SupplierGold* pobjud = new DuJewelryStrategyPatternUnabstract::SupplierGold(); DuJewelryStrategyPatternUnabstract::SupplierIncrement* pobjwar = new DuJewelryStrategyPatternUnabstract::SupplierIncrement(); pobjwar->createSupplierGold(pobjud); //创建一个黄金供应商 DuJewelryStrategyPatternUnabstract::SupplierDiamond* pobjelm = new DuJewelryStrategyPatternUnabstract::SupplierDiamond(); pobjwar->createSupplierDiamond(pobjelm);//创建一个钻石供应商 //资源释放 delete pobjwar; delete pobjud; delete pobjelm; */ } }
// GeovinDu.cpp : 此文件包含 "GeovinDu" 类。策略模式 Strategy Pattern C++ 14 // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #include "GeovinDu.h" #include <iostream> #include <sstream> #include <vector> #include "Gold.h" #include "GoldShop.h" #include "GoldCommerce.h" #include "GoldCorporation.h" #include "SupplierDiamond.h" #include "SupplierGold.h" #include "SupplierJade.h" #include "SupplierPearl.h" #include "SupplierIncrement.h" #include "StrategyProfile.h" #include "StrategyDifferentiation.h" #include "StrategyMarketFocus.h" #include "StrategyOverallCost.h" using namespace std; using namespace DuJewelryStrategyPatternUnabstract; namespace DuJewelryStrategyPattern { class Gold; /// <summary> /// /// </summary> void GeovinDu::displayUnabstract() { // Gold* prole_cor = new GoldCorporation(1000,20,500);//这没有采用工厂模式,如果主角很多,可以考虑采用工厂模式创建对象 //创建主角 Gold* prole_shop = new GoldShop(1000, 0, 200); //delete prole_shop; Gold* prole_Com = new GoldCommerce(8000, 20, 400); //prole_Com->UseItem(LF_Commerce, bussines); //成本策略1 //StrategyProfile* strateby; //StrategyOverallCost d; //strateby = &d; /* 1 例 问题: 无法实例化抽象类 已解决*/ StrategyProfile* strateby = new StrategyOverallCost(); //创建成本策略 prole_cor->SetStrategyProfile(strateby); //主角设置策略,准备 prole_cor->UseItem(LF_Corporation, colse); prole_cor->UseItem(); //主角 //差异化战略 StrategyProfile* strateby2 = new StrategyDifferentiation(); //创建差异化战略 prole_shop->SetStrategyProfile(strateby2); //主角设置策略 prole_shop->UseItem(LF_Shop, bussines); prole_shop->UseItem(); //主角用策略 StrategyProfile* strateby3 = new StrategyMarketFocus(); prole_Com->SetStrategyProfile(strateby3); prole_Com->UseItem(LF_Commerce, bussines); prole_Com->UseItem();// //释放资源 delete strateby; delete strateby2; delete strateby3; delete prole_shop; delete prole_cor; delete prole_Com; // 2 例------------------------------/**/ DuJewelryStrategyPatternUnabstract::SupplierGold* pobjud = new DuJewelryStrategyPatternUnabstract::SupplierGold(); DuJewelryStrategyPatternUnabstract::SupplierIncrement* pobdu = new DuJewelryStrategyPatternUnabstract::SupplierIncrement(); pobdu->createSupplierGold(pobjud); //创建一个黄金供应商 DuJewelryStrategyPatternUnabstract::SupplierDiamond* pobjelm = new DuJewelryStrategyPatternUnabstract::SupplierDiamond(); pobdu->createSupplierDiamond(pobjelm);//创建一个钻石供应商 DuJewelryStrategyPatternUnabstract::SupplierJade* pobjade = new DuJewelryStrategyPatternUnabstract::SupplierJade(); pobdu->createSupplierJade(pobjade);//创建一个玉供应商 DuJewelryStrategyPatternUnabstract::SupplierPearl* pobpearl = new DuJewelryStrategyPatternUnabstract::SupplierPearl(); pobdu->createSupplierPearl(pobpearl); //创建一个珍珠供应商 //资源释放 delete pobdu; delete pobjud; delete pobjelm; delete pobjade; delete pobpearl; } }
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)