设计模式 -- 2:策略模式

目录

总结部分:

策略模式和简单工厂模式很像

区别在于 简单工厂模式 需求的是由工程创造的类 去给客户直接答案

而策略模式在于 我有主体 一个主体 根据策略的不同来进行不同的计算 我的主体就负责收钱 然后调度相关策略。

策略模式的优点部分

  • 策略模式 是一种定义一系列算法的方法。从概念上来讲 这些算法都是在完成相同的业务工作,只是实现不一样,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法之间的耦合
  • 策略模式 的Strategy类层次为Context定义了一系列可供重用的算法和行为。继承有助于 析取出这些算法的公共功能
  • 策略模式简化了单元测试 每个算法都有自己的类 可以通过自己的接口单元测试

代码部分

cpp 复制代码
#include<iostream>
#include <memory>
#include <vector>
#include <algorithm>
using namespace std;


enum class StrategyType {
	NORMAL,
	DISCOUNT,
	REBATE
};
//策略类 是商品所有销售方式的基类
class Strategy {
public:
	virtual double GetResult(double TotalMoney) = 0; //纯虚基类 强迫子类去实现
};
//打折类 公有集成策略类
class DiscountStrategy:public Strategy{
public:
	DiscountStrategy(double percent) {
		DiscountPercent = percent;
	}
	double GetResult(double TotalMoney)override
	{
		double PayMoney = DiscountPercent * TotalMoney;
		return PayMoney;
	}
private:
	double DiscountPercent; //折扣的百分比
};
//原价类策略
class NormalStrategy :public Strategy {
public:
	NormalStrategy() {}
	double GetResult(double TotalMoney)override
	{
		return TotalMoney;
	}
};
//满返策略
class RebateStrategy :public Strategy {
public:
	RebateStrategy() {
		res = {
			{300,80}    //表示满300 减 80 后续可以直接在下面加 最好从数组第一位从贵的往便宜的写
		};
	}
	double GetResult(double TotalMoney)override
	{
		double PayMoney = 0;
		int n = res.size();
		for (int i = 0; i < n; i++)
		{
			if(TotalMoney > res[i][0])
			{ 
				PayMoney = TotalMoney - res[i][1];
				break;
			}
		}
		return PayMoney;
	}
private://此处的满减 可以自己写一下满多少减多少的策略 用vector二维数组保存策略 简化只写两个
	vector<vector<int>> res;
};
class CommodityContext {
public:
	std::unique_ptr<Strategy> strategy;
	CommodityContext() : strategy(nullptr) {}
	void SetStrategy(StrategyType type)
	{
		switch (type) {
		case StrategyType::NORMAL:
			strategy = std::make_unique<NormalStrategy>();
			break;
		case StrategyType::DISCOUNT:
			strategy = std::make_unique<DiscountStrategy>(0.8);
			break;
		case StrategyType::REBATE:
			strategy = std::make_unique<RebateStrategy>();
			break;
		default:
			throw std::runtime_error("No Such Strategy");
		}
	}
	double CalculatePayment(double totalMoney) {
		if (!strategy) {
			throw std::runtime_error("Strategy not set");
		}
		return strategy->GetResult(totalMoney);
	}

};



int main()
{
	try {
		CommodityContext mycontext;
		mycontext.SetStrategy(StrategyType::REBATE);
		double paymoney = mycontext.CalculatePayment(999.9);
		std::cout << "付钱:" << paymoney << std::endl;
	}
	catch (exception e)
	{
		cout << "error :" << e.what();
	}
}
相关推荐
执笔论英雄6 小时前
【大模型训练】加载load_state 中的一些技巧 工厂设计模式
设计模式
gladiator+11 小时前
Java中的设计模式------策略设计模式
java·开发语言·设计模式
在未来等你14 小时前
AI Agent设计模式 Day 2:Plan-and-Execute模式:先规划后执行的智能策略
设计模式·llm·react·ai agent·plan-and-execute
在未来等你20 小时前
AI Agent设计模式 Day 3:Self-Ask模式:自我提问驱动的推理链
设计模式·llm·react·ai agent·plan-and-execute
xiaodaidai丶1 天前
设计模式之策略模式
设计模式·策略模式
_院长大人_1 天前
设计模式-工厂模式
java·开发语言·设计模式
王道长服务器 | 亚马逊云2 天前
AWS + 苹果CMS:影视站建站的高效组合方案
服务器·数据库·搜索引擎·设计模式·云计算·aws
在未来等你2 天前
AI Agent设计模式 Day 1:ReAct模式:推理与行动的完美结合
设计模式·llm·react·ai agent·plan-and-execute
JosieBook2 天前
【SpringBoot】31 核心功能 - 单元测试 - JUnit5 单元测试中的断言机制——验证你的代码是否按预期执行了
spring boot·单元测试·log4j
乐悠小码2 天前
Java设计模式精讲---03建造者模式
java·设计模式·建造者模式