设计模式 -- 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();
	}
}
相关推荐
liu_chunhai9 分钟前
设计模式(3)builder
java·开发语言·设计模式
刷帅耍帅11 分钟前
设计模式-策略模式
设计模式·策略模式
刷帅耍帅5 小时前
设计模式-享元模式
设计模式·享元模式
刷帅耍帅5 小时前
设计模式-模版方法模式
设计模式
刷帅耍帅6 小时前
设计模式-桥接模式
设计模式·桥接模式
MinBadGuy7 小时前
【GeekBand】C++设计模式笔记5_Observer_观察者模式
c++·设计模式
刷帅耍帅8 小时前
设计模式-生成器模式/建造者模式Builder
设计模式·建造者模式
蜡笔小新..1 天前
【设计模式】软件设计原则——开闭原则&里氏替换&单一职责
java·设计模式·开闭原则·单一职责原则
性感博主在线瞎搞1 天前
【面向对象】设计模式概念和分类
设计模式·面向对象·中级软件设计师·设计方法
lucifer3111 天前
JavaScript 中的组合模式(十)
javascript·设计模式