02策略模式

news/2024/11/16 5:33:37/文章来源:https://www.cnblogs.com/BoYuCG/p/18416031

1. 案例:营业员根据客户所购买商品的单价和数量,根据不同活动向客户收费**

- 正常原价收费
- 八折收费
- 满300返100

2. 策略模式结构

- 抽象策略类(Stategy):声明算法的方法,抽象层的设计使上下文类可以无差别的调用不同的具体策略的方法

enum CashType
{NORMAL = 0,REBATE,RETURN
};class CashSuper
{
public:virtual double AcceptCash(double dMoney) = 0;
};

- 具体策略类(Concrete Strategy):实现具体的算法

class CashNormal :public CashSuper
{
public:// 通过 CashSuper 继承double AcceptCash(double dMoney) override;
};double CashNormal::AcceptCash(double dMoney)
{return dMoney;
}
class CashRebate :public CashSuper
{
public:CashRebate(double dMoneyRebate);// 通过 CashSuper 继承double AcceptCash(double dMoney) override;
private:double m_dMoneyRebate;
};CashRebate::CashRebate(double dMoneyRebate):m_dMoneyRebate(dMoneyRebate)
{
}double CashRebate::AcceptCash(double dMoney)
{return dMoney * m_dMoneyRebate;
}
class CashReturn :public CashSuper
{
public:CashReturn(double dMoneyCondition, double dMoneyReturn);// 通过 CashSuper 继承double AcceptCash(double dMoney) override;
private:double m_dMoneyCondition;double m_dMoneyReturn;
};CashReturn::CashReturn(double dMoneyCondition, double dMoneyReturn):m_dMoneyCondition(dMoneyCondition), m_dMoneyReturn(dMoneyReturn)
{
}double CashReturn::AcceptCash(double dMoney)
{if (fabs(m_dMoneyCondition) < 1e-6)return dMoney;return dMoney - floor(dMoney / m_dMoneyCondition) * m_dMoneyReturn;
}

- 上下文类(Context):上下文类是使用算法的角色,可以在解决不同具体的问题时实例化不同的具体策略类对象

class CashSuper;
class Context
{
public:Context(CashType eCashType);double GetResult(double dMoney);
private:std::shared_ptr<CashSuper> m_spCashSuper;
};Context::Context(CashType eCashType)
{switch (eCashType){case NORMAL:m_spCashSuper = std::make_shared<CashNormal>();break;case REBATE:m_spCashSuper = std::make_shared<CashRebate>(0.8);break;case RETURN:m_spCashSuper = std::make_shared<CashReturn>(300.0, 100.0);break;default:m_spCashSuper = std::make_shared<CashNormal>();break;}
}double Context::GetResult(double dMoney)
{return m_spCashSuper->AcceptCash(dMoney);
}

3. 用法

    std::shared_ptr<Context> spCashNormalContext = std::make_shared<Context>(CashType::NORMAL);std::shared_ptr<Context> spCashRebateContext = std::make_shared<Context>(CashType::REBATE);std::shared_ptr<Context> spCashReturnContext = std::make_shared<Context>(CashType::RETURN);std::cout << spCashNormalContext->GetResult(600) << std::endl;std::cout << spCashRebateContext->GetResult(600) << std::endl;std::cout << spCashReturnContext->GetResult(600) << std::endl;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/797993.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三、浅层神经网络

1、神经网络概览什么是神经网络?如下图:神经网络的结构与逻辑回归类似,只是神经网络的层数比逻辑回归多一层,多出来的中间那层称为隐藏层或中间层。从计算上来看,神经网络的正向传播和反向传播比logistic回归多了一次重复的计算。引入新的标签:方括号上标[i]表示当前所处…

windows安装rabbitmq后出现:Error::plugins_dir_does not_exist

安装的路径正常,没有空格中文字符啥的。 环境变量也配置了。原因是:安装otp_win64_24.1.7时没有选择以管理员身份运行。重新卸载安装即可

Zero-Shot,One-Shot,Few-Shot,In-Context Learning

Zero-Shot,One-Shot,Few-Shot,In-Context Learning https://blog.csdn.net/weixin_44212848/article/details/139902394In-Context Learning定义:In-context learning是一种在不显式微调模型权重的情况下,通过给模型提供相关的上下文信息(例如提示或样本)来实现模型性能…

GoLand 相关设置

GoLand 相关设置 自动导包设置

AutoCAD C# 判断多边形与点的位置关系

书上说,射线法和叉乘法感觉都不完整 下面我分享我写的基于AutoCAD BREP算法var ed = acApp.Application.DocumentManager.MdiActiveDocument.Editor;var peo = new PromptEntityOptions("Select a PolyLine : ");peo.SetRejectMessage("Only PolyLine");…

Nginx使用篇:实现负载均衡、限流与动静分离

Nginx实用篇:实现负载均衡、限流与动静分离| 原创作者/编辑:凯哥Java | 分类:Nginx学习系列教程nginx的logo Nginx 作为一款高性能的 HTTP 服务器及反向代理解决方案,在互联网架构中扮演着至关重要的角色。它不仅支持负载均衡、流量控制等功能…

[ACTF2020 新生赛]Upload

启动靶机,发现有前端验证先绕过前端验证,在burp中尝试发现验证在文件名后缀,且会重命名文件名 发现.ini能上传但是会被重命名,既然不像前端显示只有三种格式能上传,这里我们寻找能绕过的后缀尝试发现phtml能上传成功 //PHTML 扩展名是 PHP 的一个模块,它允许在 HTML 文件…

上海登陆最强台风 台风路径追踪 All In One

上海登陆最强台风 & 台风路径追踪 All In One 上海最强台风路径追踪 中央气象台、市气象服务中心介绍,今年第13号台风“贝碧嘉”(强台风级)的中心已于今天(2024年09月16日)7点30分前后在上海浦东临港新城登陆,登陆时中心附近最大风力14级(42米/秒),中心最低气压为…

再vue中使用Vuetify 创建app项目

vue:2 Vuetify :2与vue创建普通项目相同:https://www.cnblogs.com/yansans/p/18342267vscode打开项目,在项目终端中运行vue add vuetify@2之后会出现,选择默认即可(回车) 几个选项的解释: 1. Vuetify 2 - Configure Vue CLI (advanced)解释:这是一个高级选项,允许你对…

广东产业转移工业园

广东产业转移工业园

南沙C++信奥老师解一本通题 1228:书架

​【题目描述】John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。 John共有NN头奶牛(1≤N≤20,000),每头奶牛有自己的高度Hi(1≤Hi≤10,000),N头奶牛的总高度为S。书架高度为B(1≤B≤S<2,000,000,007)。 为了到达书架顶层,奶牛可以踩着…

基于Java+Springboot+Vue开发的医院门诊预约挂号系统

项目简介该项目是基于Java+Springboot+Vue开发的医院门诊预约挂号系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的门诊预约挂号管理系统项目,大学生可以在…