// 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" 函数。程序执行将在此处开始并结束。 // Jewelry Builder Pattern 生成器模式 建造者模式、Builder // // 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% 请按任意键继续. . .
标签:StrategyProfile,Gold,Pattern,void,namespace,II,mainobj,cpp,include From: https://www.cnblogs.com/geovindu/p/17373230.html