首页 > 其他分享 >cpp: Strategy Pattern II

cpp: Strategy Pattern II

时间:2023-05-05 09:55:54浏览次数:38  
标签:StrategyProfile Gold Pattern void namespace II mainobj cpp include

 

// 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

相关文章

  • 极速进化,光速转录,C++版本人工智能实时语音转文字(字幕/语音识别)Whisper.cpp实践
    业界良心OpenAI开源的Whisper模型是开源语音转文字领域的执牛耳者,白璧微瑕之处在于无法通过苹果M芯片优化转录效率,Whisper.cpp则是Whisper模型的C/C++移植版本,它具有无依赖项、内存使用量低等特点,重要的是增加了CoreML支持,完美适配苹果M系列芯片。Whisper.cpp的张量运算......
  • 2.八数码II(搜索进阶 IDA*估价函数 + 迭代加深)
    八数码II↑题目链接题目在一个\(3×3\)的网格中,\(1∼8\)这8个数字和一个X恰好不重不漏地分布在这\(3×3\)的网格中。例如:123X46758在游戏过程中,可以把X与其上、下、左、右四个方向之一的数字交换(如果存在)。把X与上下左右方向数字交换的行动记录为u......
  • Intel Pentium III 512MB内存 i815集显上安装Ubuntu Server 14.04
    自己的御用奔腾IIIPC,接口齐全,准备安装UbuntuServer14.04i386,继续发挥余热,物尽其用。 基本配置:CPU:IntelPentiumIII1000MHz,256KBL2,133MHzFSB,0.18um,1.75v,Coppermine-TRAM:512MBSDRAM,PC133GPU:Inteli82815IGPHDD:128GBSSD, withSATAtoIDEa......
  • 剑指 Offer II 022. 链表中环的入口节点
    题目链接:剑指OfferII022.链表中环的入口节点方法一:哈希解题思路统计走过的节点,当第一次遇到重复的节点时,即为入口节点,否则为\(null\)。代码classSolution{public:ListNode*detectCycle(ListNode*head){unordered_map<ListNode*,bool>cache;......
  • 23 IIC(一)IIC协议简介
    1硬件连接IIC硬件接线一般如下所示。从主控芯片引出两根线SCL和SDA。外加一个上拉电阻2数据传输格式2.1写操作主控芯片发出start信号主控芯片发出一字节的数据。前7bit为设备地址,最后一bit为方向:0表示写,1表示读主设备等待从设备应答主设备接到从设备的应答后开始发送......
  • 剑指 Offer II 020. 回文子字符串的个数
    题目链接:剑指OfferII020.回文子字符串的个数方法一:动态规划解题思路状态表示:\(dp[i][j]\)表示子字符串\(s[i,j]\)是否为回文串;状态计算:若\(s[i]\)!=\(s[j]\),显然不是;若\(s[i]\)==\(s[j]\),有以下几种可能:\(i\)==\(j\),只有一个字符,是回文串;\(i\)+\(1\)......
  • cpp: Prototype Pattern
     //Gold.h:此文件包含"Gold"类。原型模式PrototypePatternC++14//2023年5月1日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce#ifndefGOLD_H#defineGOLD_H#include<iostream>usingnamespacestd;namespaceDuJewelryPrototyp......
  • cpp: Abstract Factory Pattern
     //Gold.h:此文件包含"Gold"类。AbstractFactoryPatternC++14//2023年4月30日涂聚文GeovinDuVisualStudio2022edit.#pragmaonce#ifndefGOLD_H#defineGOLD_H#include<iostream>usingnamespacestd;namespaceDuJewelryAbstra......
  • 【剑指 Offer】 14- II. 剪绳子 II
    【题目】给你一根长度为n的绳子,请把绳子剪成整数长度的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要......
  • 使用CPPUNIT对MFC程序进行测试
    1 资源下载  使用的是cppunit-1.12.1,在网上下载后需要自己编译,编译过程中可能出现各种问题 在此,将自己编译好的软件放在了资源中,可以直接使用免去了重复编译的工作。   资源中同时包含CPPUnitProjectWizard 2 环境配置  cppunit不能直接使用,必须先配置好运行环......