当前位置: 首页 > news >正文

设计模式 -- 2:策略模式

目录

    • 总结部分:
    • 策略模式的优点部分
    • 代码部分

总结部分:

策略模式和简单工厂模式很像
区别在于 简单工厂模式 需求的是由工程创造的类 去给客户直接答案
而策略模式在于 我有主体 一个主体 根据策略的不同来进行不同的计算 我的主体就负责收钱 然后调度相关策略。
在这里插入图片描述

策略模式的优点部分

  • 策略模式 是一种定义一系列算法的方法。从概念上来讲 这些算法都是在完成相同的业务工作,只是实现不一样,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法之间的耦合
  • 策略模式 的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();}
}
http://www.lryc.cn/news/317448.html

相关文章:

  • 【快速上手ProtoBuf】proto 3 语法详解
  • 人工智能的幽默“失误”
  • js的异步请求?
  • 华润对象存储(OBS)工具类
  • 强缓存和协商缓存的区别?
  • ChatGPT提问技巧——对抗性提示
  • openGauss使用BenchmarkSQL进行性能测试(上)
  • Java的线程池机制
  • EasyCode 插件的具体使用
  • Ypay源支付6.9无授权聚合免签系统可运营源码
  • SpringBoot+Vue项目报错(问题已解决)
  • DEAP 自定义交叉操作
  • ByText
  • Vcenter esxi web界面访问提示权限被拒绝
  • 掌握FilterOutputStream类!
  • YOLOv8改进 | 图像去雾 | 特征融合注意网络FFA-Net增强YOLOv8对于模糊图片检测能力(北大和北航联合提出)
  • Python (用户登录、身份归属地查询添加异常处理、绘制多角星、电影信息提取)
  • Set cancelled by MemoryScratchSinkOperator
  • Python 查找PDF中的指定文本并高亮显示
  • 岩土工程渗流问题之有限单元法:理论、模块化编程实现、开源程序应用
  • 解决 :nvrtc: error: invalid value for --gpu-architecture (-arch)
  • Rust教程:How to Rust-从开始之前到Hello World
  • 浅谈人工智能
  • OpenFeign服务接口调用
  • SQLiteC/C++接口详细介绍之sqlite3类(五)
  • Linux 之二:CentOS7 的 IP 常用命令和配置及 xshell 基本使用方法
  • 24-Java策略模式 ( Strategy Pattern )
  • 突破编程_C++_C++11新特性(模板的改进与细节)
  • 云原生消息流系统 Apache RocketMQ 在腾讯云的大规模生产实践
  • Node.js的事件驱动模型(非阻塞I/O)