设计模式 -- 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();
	}
}
相关推荐
沐森3 小时前
在实战中运用泛型和动态trait(特质)
设计模式
lomocode4 小时前
改一个需求动 23 处代码?你可能踩进了这个坑
后端·设计模式
喷火龙8号5 小时前
JWT 认证方案深度对比:单 Token 扩展刷新 vs 双 Token 验证
后端·设计模式·架构
掘根18 小时前
【消息队列项目】公共模块实现
log4j
fakerth1 天前
【OpenHarmony】设计模式模块详解
c++·单例模式·设计模式·openharmony
alibli1 天前
一文学会设计模式之创建型模式及最佳实现
c++·设计模式
1024肥宅1 天前
前端常用模式:提升代码质量的四大核心模式
前端·javascript·设计模式
郝学胜-神的一滴1 天前
设计模式依赖于多态特性
java·开发语言·c++·python·程序人生·设计模式·软件工程
帅次1 天前
系统分析师:软件需求工程的软件需求概述、需求获取、需求分析
设计模式·重构·软件工程·团队开发·软件构建·需求分析·规格说明书
EXtreme351 天前
【数据结构】算法艺术:如何用两个栈(LIFO)优雅地模拟队列(FIFO)?
c语言·数据结构·算法·设计模式·栈与队列·摊还分析·算法艺术