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(涂聚文)
浙公网安备 33010602011771号