做网站可以用中文域名备案嘛,山东省住房和城乡城乡建设厅网站,建站品牌大全,网站建设边框目录 总结部分#xff1a;策略模式的优点部分代码部分 总结部分#xff1a;
策略模式和简单工厂模式很像 区别在于 简单工厂模式 需求的是由工程创造的类 去给客户直接答案 而策略模式在于 我有主体 一个主体 根据策略的不同来进行不同的计算 我的主体就负责收钱 然后调度相… 目录 总结部分策略模式的优点部分代码部分 总结部分
策略模式和简单工厂模式很像 区别在于 简单工厂模式 需求的是由工程创造的类 去给客户直接答案 而策略模式在于 我有主体 一个主体 根据策略的不同来进行不同的计算 我的主体就负责收钱 然后调度相关策略。
策略模式的优点部分
策略模式 是一种定义一系列算法的方法。从概念上来讲 这些算法都是在完成相同的业务工作只是实现不一样它可以以相同的方式调用所有的算法减少了各种算法类与使用算法之间的耦合策略模式 的Strategy类层次为Context定义了一系列可供重用的算法和行为。继承有助于 析取出这些算法的公共功能策略模式简化了单元测试 每个算法都有自己的类 可以通过自己的接口单元测试
代码部分
#includeiostream
#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二维数组保存策略 简化只写两个vectorvectorint res;
};
class CommodityContext {
public:std::unique_ptrStrategy strategy;CommodityContext() : strategy(nullptr) {}void SetStrategy(StrategyType type){switch (type) {case StrategyType::NORMAL:strategy std::make_uniqueNormalStrategy();break;case StrategyType::DISCOUNT:strategy std::make_uniqueDiscountStrategy(0.8);break;case StrategyType::REBATE:strategy std::make_uniqueRebateStrategy();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();}
}