首页 > 其他分享 >02策略模式

02策略模式

时间:2024-09-16 09:51:24浏览次数:10  
标签:02 std 策略 double AcceptCash dMoney 模式 shared public

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;

标签:02,std,策略,double,AcceptCash,dMoney,模式,shared,public
From: https://www.cnblogs.com/BoYuCG/p/18416031

相关文章

  • WEB-API+.NET+CRUD+SSMS(VS2022)
    1.使用VS2022创建一个web-api项目,根目录如下:其中TestCode.cs写model实体类,Controller编写控制器2.实体类Item,编写对应的属性点击查看代码publicclassItem{[Required]publicintId{get;set;}[Required]publicintFieldID{get;set;}......
  • 简单工厂模式
    1.案例:营业员根据客户所购买商品的单价和数量,根据不同活动向客户收费-正常原价收费-八折收费-满300返1002.简单工厂模式结构-抽象产品(AbstractProduct):具体产品类的基类,包含创建产品的公共方法enumCashType{NORMAL=0,REBATE,RETURN};class......
  • VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Serve
    VMwareESXi7.0U3qmacOSUnlocker集成驱动版更新OEMBIOS2.7支持WindowsServer2025VMwareESXi7.0U3qmacOSUnlocker&OEMBIOS2.7集成网卡驱动和NVMe驱动(集成驱动版)ESXi7.0U3标准版集成Intel网卡、RealtekUSB网卡和NVMe驱动请访问原文链接:h......
  • [ACTF2020 新生赛]Upload
    启动靶机,发现有前端验证先绕过前端验证,在burp中尝试发现验证在文件名后缀,且会重命名文件名发现.ini能上传但是会被重命名,既然不像前端显示只有三种格式能上传,这里我们寻找能绕过的后缀尝试发现phtml能上传成功//PHTML扩展名是PHP的一个模块,它允许在HTML文件中使用PHP......
  • Kali Linux 2024.3 发布下载 - 领先的渗透测试发行版
    KaliLinux2024.3发布(Multipletransitions)-领先的渗透测试发行版ThemostadvancedPenetrationTestingDistribution请访问原文链接:https://sysin.org/blog/kali-linux/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgKaliLinux2024.3已经可以下载,发行......
  • 第六届机器人与智能制造技术国际会议 (ISRIMT 2024) 2024 6th International Symposiu
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus大会时间:2024年9月20-22日大会地点:中国-江苏常州-河海大学常州校区三、大会......
  • 【保奖思路】2024年华为杯研赛F题保奖思路(点个关注,后续会更新)
    您的点赞收藏是我继续更新的最大动力!一定要点击文末的卡片,那是获取资料的入口!现分享2023年华为杯研赛F题高质量思路,供大家学习:问题1思路2023华为杯研究生数学建模F题问题1:如何有效应用双偏振变量改进强对流预报,仍是目前气象预报的重点难点问题。请利用题目提供的数据,建立......
  • 【保奖思路】2024年华为杯研赛F题保奖思路(点个关注,后续会更新)
    您的点赞收藏是我继续更新的最大动力!一定要点击文末的卡片,那是获取资料的入口!现分享2023年华为杯研赛F题高质量思路,供大家学习:问题1思路2023华为杯研究生数学建模F题问题1:如何有效应用双偏振变量改进强对流预报,仍是目前气象预报的重点难点问题。请利用题目提供的数据,建立......
  • 【AI学习】陶哲轩在 2024 年第 65 届国际数学奥林匹克(IMO)的演讲:AI 与数学
    陶哲轩在2024年第65届国际数学奥林匹克关于AI和数学的演讲,很有意思。陶哲轩的讲话语速太快了,足见其聪明!AI用于数学的一些方面:陶哲轩介绍到刚刚被数学家接受并开始普及的方法:形式化证明辅助工具。形式化证明辅助工具是用于验证论证是否真正正确的语言,可以验证某个论......
  • 2024CSP-J初赛全真模拟卷选择题篇(原创,难度偏简单)
    注意,本卷由再临TSC原创,禁止转载!本卷难度偏简单,若想要通过初赛本卷应拿80+分左右查看答案的方法:if(设备=="PC"){    把光标移到答案上面,选中答案,就会显示();}elseif(设备==移动端b||设备==平板){    把答案复制,找到随便一个地方粘贴即可();}else{......