目录
- 总结部分:
- 策略模式的优点部分
- 代码部分
总结部分:
策略模式和简单工厂模式很像
区别在于 简单工厂模式 需求的是由工程创造的类 去给客户直接答案
而策略模式在于 我有主体 一个主体 根据策略的不同来进行不同的计算 我的主体就负责收钱 然后调度相关策略。
策略模式的优点部分
- 策略模式 是一种定义一系列算法的方法。从概念上来讲 这些算法都是在完成相同的业务工作,只是实现不一样,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法之间的耦合
- 策略模式 的Strategy类层次为Context定义了一系列可供重用的算法和行为。继承有助于 析取出这些算法的公共功能
- 策略模式简化了单元测试 每个算法都有自己的类 可以通过自己的接口单元测试
代码部分
#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();
}
}