设计模式 -- 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();
	}
}
相关推荐
xiaolyuh1238 小时前
Spring 框架 核心架构设计 深度详解
spring·设计模式·spring 设计模式
GISer_Jing19 小时前
智能体工具使用、规划模式
人工智能·设计模式·prompt·aigc
GISer_Jing19 小时前
AI Agent:学习与适应、模型上下文协议
人工智能·学习·设计模式·aigc
小马爱打代码20 小时前
MyBatis设计模式:构建者、工厂、代理模式
设计模式·mybatis·代理模式
月明长歌21 小时前
Javasynchronized 原理拆解:锁升级链路 + JVM 优化 + CAS 与 ABA 问题(完整整合版)
java·开发语言·jvm·安全·设计模式
会员果汁21 小时前
12.设计模式-状态模式
设计模式·状态模式
且去填词21 小时前
DeepSeek :基于 AST 与 AI 的遗留系统“手术刀”式治理方案
人工智能·自动化·llm·ast·agent·策略模式·deepseek
Yu_Lijing21 小时前
基于C++的《Head First设计模式》笔记——抽象工厂模式
c++·笔记·设计模式
会员果汁1 天前
13.设计模式-适配器模式
设计模式·适配器模式
GISer_Jing2 天前
AI:多智能体协作与记忆管理
人工智能·设计模式·aigc